【问题标题】:matlab array elements that meet a condition no loop满足条件的matlab数组元素无循环
【发布时间】:2014-04-30 13:15:23
【问题描述】:

我有一个元素数组和 2 个其他数组
我正在做这样的事情:

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

有没有什么方法可以在没有循环的情况下获得相同的结果?

【问题讨论】:

    标签: matlab vectorization logical-operators


    【解决方案1】:

    要删除循环,您可以使用bsxfun,保留脚本的其余部分:

    res = sum(bsxfun(@lt,a',k).*bsxfun(@lt,b',k),1).';
    

    基本上,它将小于运算符应用于向量对 (a,k) 和 (b,k);转置保证您将列向量与第一行进行比较,从而得到矩阵结果。点积的减少是沿着指定的方向(行方向)进行的。我将结果转置为与您的大小相同,但这不是强制性的。

    【讨论】:

    • 这里是bsxfun
    • @Divakar 我必须承认,我是这个很棒的功能的忠实粉丝 :)
    • @Bentoy13 我是这些粉丝的粉丝 ;) 正因为如此,你才获得了我的 +1!
    • 这很好,但不熟悉 matlab 的人无法阅读
    • @jucestain 我承认这对于初学者来说并不容易理解。但是,我认为括号有助于将公式切成更短的易于理解的部分,如果您了解 bsxfun 的目的,您就可以掌握它。而且,这就是我试图解释解决方案的原因——如果你认为它不清楚,我可以扩展它。
    【解决方案2】:

    你也可以使用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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2011-04-16
      • 2018-07-26
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多