Matlab 在矩阵中查找匹配行

Matlab 在矩阵中查找匹配行,matlab,Matlab,假设我有一个(mxn)矩阵Q和一个行向量r,例如 Q = [ 1 2 3 ; 4 2 3 ; 5 6 7 ; 1 2 3 ; 1 2 3 ; 1 2 5 ]; r = [ 1 2 3 ]; 获取逻辑向量(长度为m)的最简单方法是什么,该向量指示Q中的哪些行(对于所有元素)与指定的行r相同 在上面的示例案例中,应该是 [ 1 0 0 1 1 0 ]; bsxfun(@eq,r,Q)比较每一行并返回一个与Q大小相同的矩阵: >> bsxfun(@eq, r, Q) ans =

假设我有一个(mxn)矩阵Q和一个行向量r,例如

Q = [ 1 2 3 ; 4 2 3 ; 5 6 7 ; 1 2 3 ; 1 2 3 ; 1 2 5 ];

r = [ 1 2 3 ];
获取逻辑向量(长度为m)的最简单方法是什么,该向量指示Q中的哪些行(对于所有元素)与指定的行r相同

在上面的示例案例中,应该是

[ 1 0 0 1 1 0 ];
bsxfun(@eq,r,Q)
比较每一行并返回一个与Q大小相同的矩阵:

>> bsxfun(@eq, r, Q)

ans =

   1     1     1
   0     1     1
   0     0     0
   1     1     1
   1     1     1
   1     1     0
all
函数分别计算每行的bsxfun结果是否均为真。因此,它返回:

>> all(ans,2)'

ans =

   1     0     0     1     1     0

是的,还有一个转置操作符
来匹配所需的行输出

使用
repmat
更简单的方法:

a = [1 2 3; 4 5 6; 7 8 9];
t = [4 5 6];
[x,y] = size(a);
r = all(a==repmat(t,y,1), 2)'
您可以在一行中使用和执行:

>> ismember(Q,r,'rows')'

ans =

     1     0     0     1     1     0

此外,效率较低,速度较慢,请参见:不需要效率的地方是一个诅咒。编写和理解的简单性直接关系到更好的代码。关于
bsxfun(@eq,r,Q)
,有什么这么难理解的??如果你通过这些简单的例子来学习它,你会在以后处理复杂问题时从中受益;每个函数都必须在某个时刻学习。。顺便说一句,如果可读性仍然是一个问题,他们为此发明了一些东西:注释。如果我不知道repmat是做什么的,那么你的代码就没有意义了,因为我发现,
repmat
的可读性与
bsxfun
的可读性相当-这是
ismember
解决方案更为清晰。非常密切相关:值得注意的是,这比ismember快了一点
>> ismember(Q,r,'rows')'

ans =

     1     0     0     1     1     0
a = [1 1 1; 2 2 2; 3 3 3];
b = a(1:2,;);
[temp locb] = ismember(a,b,'rows');
b(locb(locb~=0),:)

ans =

     1     1     1
     2     2     2