【问题标题】:Fast way to compare row-wise matrix with vector in Matlab在Matlab中比较行矩阵与向量的快速方法
【发布时间】:2017-03-17 20:09:50
【问题描述】:

我在 Matlab 中有一个矩阵 A,维度为 MxN,两个行向量 BD,维度为 1xN。我想知道将BA 的每一行进行比较的最快方法。所有元素都是10

具体来说,

A=[  1     1     1;
     1     1     0;
     1     0     1;
     1     0     0;
     0     1     1;
     0     1     0;
     0     0     1;
     0     0     0];



  B=[1 1 1];
  D=[1 0 0]

我想用C(i)=1 if 构造一个维度为Mx1 的矩阵C

B(1,1)>=A(i,1)B(1,2)>=A(i,2) 和 ...B(1,N)>=A(i,N)

D(1,1)<=A(i,1)D(1,2)<=A(i,2) 和 ...D(1,N)<=A(i,N)

B(:) 不同于 A(i,:)

D(:) 不同于A(i,:)

在示例中

C=[0;1;1;0;0;0;0;0];

一种方法可以是

lownew=repmat(D,size(A,1),1);

greatnew=repmat(B,size(A,1),1); 

C=(sum(lownew<=A,2)==N & sum(greatnew>=A,2)==N & sum(lownew==A,2)~=N & sum(greatnew==A,2)~=N);

有没有更快的方法?我的真实矩阵A 的维度大于10^6

【问题讨论】:

    标签: matlab


    【解决方案1】:

    当然,最快的方法(代码行数和计算时间)当然是使用bsxfun

    在你的情况下:

    tmp = bsxfun(@ge, A, B);
    res = all(tmp,2);
    

    是您要搜索的内容。请注意,bsxfun 会自动处理不同大小的输入,就像在您的示例中一样,因此此处无需使用 repmat 或矩阵乘法。

    编辑

    与新约束相同的想法。请注意,a&lt;=ba~=b 简化为 a&lt;b

    tmp = bsxfun(@lt, A, B) && bsxfun(@lt, D, A);
    res = all(tmp,2);
    

    【讨论】:

    • 谢谢,我已经详细阐述了我的问题。可以看看吗?
    • 嘿,不要在回答后那样改变问题。请改为问另一个问题。无论如何我都会编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2014-07-14
    • 2013-05-04
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多