一个简单的问题,但我不太擅长 MATLAB。我有向量x
,(n×1)y
,(米×1)和w = [x;y]
。我想定义M
(n+m x 1) as M(i) = x 中小于或等于 w(i) 的元素数量(w 已排序)。这只是没有削减它:
N = n + m;
M = zeros(N,1);
for i = 1:N
for j = 1:n
if x(j) <= w(i)
M(i) = M(i) + 1;
end
end
end
这不是一个特别聪明的方法,我的一些数据向量 m 和 n 约为 100000。
Thanks!
这可能看起来很神秘,但它应该给出与嵌套循环相同的结果:
M = histc(-x(:)',[-fliplr(w(:)') inf]);
M = cumsum(fliplr(M(1:N)))';
上面假设w
已按升序排序。
解释
您排序的向量w
可以被认为是用于创建直方图的 bin 边缘HISTC http://www.mathworks.com/access/helpdesk/help/techdoc/ref/histc.html功能。一旦计算出每个 bin 中(即边缘之间)的值的数量,就可以使用以下函数计算这些 bin 的累积总和:CUMSUM http://www.mathworks.com/access/helpdesk/help/techdoc/ref/cumsum.html函数会给你你的向量M
。上面的代码看起来如此混乱的原因(带有否定和函数FLIPLR http://www.mathworks.com/access/helpdesk/help/techdoc/ref/fliplr.html其中)是因为你想找到其中的值x
小于或等于中的每个值w
,但是函数HISTC http://www.mathworks.com/access/helpdesk/help/techdoc/ref/histc.html按以下方式存储数据:
n(k)
计算值x(i)
if edges(k)
<= x(i) < edges(k+1)
.
请注意少于用于每个 bin 的上限。您可能想要翻转行为,以便根据规则进行分类edges(k) < x(i) <= edges(k+1)
,这可以通过否定要分箱的值、否定边缘、翻转边缘来实现(因为边缘输入到HISTC http://www.mathworks.com/access/helpdesk/help/techdoc/ref/histc.html必须是单调非递减的),然后翻转返回的 bin 计数。价值inf http://www.mathworks.com/access/helpdesk/help/techdoc/ref/inf.html用作边缘值来计算小于最低值的所有内容w
在第一个垃圾箱中。
如果您想查找以下值x
那只是少于中的每个值w
,代码会简单得多:
M = histc(x(:)',[-inf w(:)']);
M = cumsum(M(1:N))';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)