matlab数组元素满足条件无循环

时间:2014-04-30 13:15:23

标签: matlab vectorization logical-operators

我有一系列元素和另外两个数组 我正在做这样的事情:

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

有没有办法在没有循环的情况下得到相同的结果?

2 个答案:

答案 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)

相关问题