2012-05-09 57 views
11

假设我有一个(m×n)矩阵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 ]; 
+0

与以下内容非常相关:http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix – neuronet

回答

19

您可以使用ismember并做到这一点在单行中:

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

ans = 

    1  0  0  1  1  0 
13
all(bsxfun(@eq, r, Q),2)' 

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 

,是的,也有置算'以匹配所需的行输出

+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)' 
+0

的速度还要快,效率也更低,见:http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/#9 –

+0

不需要的效率是一个诅咒。编写和理解的简单性直接关系到更好的代码。 – Castilho

+0

关于'bsxfun(@eq,r,Q)''很难理解什么?如果您通过这样简单的示例学习它,稍后您将在应用复杂问题时受益。 –

1
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