我有一系列元素和另外两个数组 我正在做这样的事情:
a=[1 3 2 45 4 23 16];
b=[3 9 1 27 33 50 5];
m=10;
k=linspace(min(a),max(a),m);
res=zeros(m,1);
for i=1:m
res(i) = sum((a < k(i)).*(b < k(i)));
end
有没有办法在没有循环的情况下得到相同的结果?
答案 0 :(得分:6)
要删除循环,您可以使用bsxfun
,保留脚本的其余部分:
res = sum(bsxfun(@lt,a',k).*bsxfun(@lt,b',k),1).';
基本上,它将运算符应用于少于向量对(a,k)和(b,k);转置保证您将列向量与第一行进行比较,从而得到矩阵结果。点积的减少是沿指定方向(行方向)进行的。我将结果转置为与您的大小相同,但不是强制性的。
答案 1 :(得分:1)
您也可以使用repmat
:
a=[1 3 2 45 4 23 16];
b=[3 9 1 27 33 50 5];
m=10;
k=linspace(min(a),max(a),m);
for i=1:m
res(i) = sum((a < k(i)).*(b < k(i)));
end
k=transpose(k);
k=repmat(k,[1,7]);
a=repmat(a,[m,1]);
b=repmat(b,[m,1]);
res2 = sum((a<k).*(b<k),2);
请注意res2=transpose(res)