计算向量中的值少于另一个向量中的每个元素

时间:2018-11-16 16:26:07

标签: arrays matlab vector

我有两个向量rd,我想知道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

3 个答案:

答案 0 :(得分:6)

您可以在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);

答案 1 :(得分:3)

您可以使用r一次构造一个矩阵来标记向量d的值,该值要小于向量bsxfun的值,然后将这些值求和:

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

答案 2 :(得分: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