在Matlab中快速比较行方式矩阵与向量

时间:2017-03-17 20:09:50

标签: matlab

我在维度A的Matlab中有一个矩阵MxN,而维度B的两个行向量D1xN。我想知道将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构建维度Mx1的矩阵C(i)=1,如果

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

1 个答案:

答案 0 :(得分:0)

当然,最快的方式(代码行数和计算时间)肯定会使用bsxfun

在你的情况下:

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

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

修改

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

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