我在维度A
的Matlab中有一个矩阵MxN
,而维度B
的两个行向量D
和1xN
。我想知道将B
与A
的每一行进行比较的最快方法。所有元素均为1
或0
。
具体地,
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
。
答案 0 :(得分:0)
当然,最快的方式(代码行数和计算时间)肯定会使用bsxfun
。
在你的情况下:
tmp = bsxfun(@ge, A, B);
res = all(tmp,2);
是您要搜索的内容。请注意,bsxfun
会自动处理不同大小的输入,例如您的示例,因此无需在此处使用repmat
或矩阵乘法。
修改强>
与新约束相同的想法。请注意,a<=b
和a~=b
简化为a<b
:
tmp = bsxfun(@lt, A, B) && bsxfun(@lt, D, A);
res = all(tmp,2);