我有两个向量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
答案 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