【问题标题】:Count values in a vector less than each one of the elements in another vector计算一个向量中的值小于另一个向量中的每个元素
【发布时间】:2019-04-19 21:01:45
【问题描述】:

我有两个向量 r 和 d,我想知道 r<d(i) 的次数,其中 i=1:length(d)。

r=rand(1,1E7);
d=linspace(0,1,10);

到目前为止,我得到了以下内容,但它不是很优雅:

for i=1:length(d)
sum(r<d(i))
end

这是 R 中的一个示例,但我不确定这是否适用于 matlab: Finding number of elements in one vector that are less than an element in another vector

【问题讨论】:

    标签: arrays matlab vector


    【解决方案1】:

    对于d中的每个元素,数一下这个元素比r中的元素大多少倍,相当于你的问题。

    r=rand(1,10);
    d=linspace(0,1,10);
    
    result = sum(d>r(:))
    

    输出:

    result =
         0     0     1     2     7     8     8     8     9    10
    

    【讨论】:

      【解决方案2】:

      您可以使用带有bsxfun 的单例扩展:比循环更快、更优雅,但也更占用内存:

      result = sum(bsxfun(@lt, r(:), d(:).'), 1);
      

      感谢implicit singleton expansion,在最近的 Matlab 版本中,bsxfun 可以被删除:

      result = sum(r(:)<d(:).', 1);
      

      另一种方法是将histcounts 函数与'cumcount' 选项一起使用:

      result = histcounts(r(:), [-inf; d(:); inf], 'Normalization', 'cumcount');
      result = result(1:end-1);
      

      【讨论】:

      • @Brice¯\_(ツ)_/¯ :-D
      • 感谢您这么快的回复!第一个适用于我的示例向量,但我的实际 r 长度为 1E7....而 d 只有 10。它说我会用完内存。我应该更新我的问题以反映这一点。很抱歉造成混乱。
      • @HCAI histcounts 方法应该会更好
      • 非常感谢,我愿意接受您的回答。 histcount 超级快!!!
      【解决方案3】:

      您可以使用bsxfun 一次性构建一个矩阵,标记来自向量r 的值低于来自向量d 的值,然后对这些值求和:

      flag=bsxfun(@lt,r',d);
      result=sum(flag,1);
      

      【讨论】:

      • 感谢您的回答,我愿意接受 Luis 的回答,因为 histcount 似乎要快一些,尽管这也有效。
      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多