我有两个向量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:查找一个向量中少于另一个向量中元素的元素数
您可以使用bsxfun
的单例扩展:比循环更快、更优雅,但也更占用内存:
result = sum(bsxfun(@lt, r(:), d(:).'), 1);
在最近的Matlab版本中,由于隐式单例扩展,bsxfun
可以被删除:
result = sum(r(:)<d(:).', 1);
另一种方法是将histcounts
函数与'cumcount'
选项一起使用:
result = histcounts(r(:), [-inf; d(:); inf], 'Normalization', 'cumcount');
result = result(1:end-1);
您可以使用bsxfun
一次构建一个矩阵,标记向量r
的值低于向量d
的值,然后对值求和:
flag=bsxfun(@lt,r',d);
result=sum(flag,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