2012-05-09 4 views
11

Supposons que j'ai une matrice (m x n) Q et un vecteur r, p.trouver des rangées correspondantes dans la matrice

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

r = [ 1 2 3 ]; 

Quel est le meilleur moyen pour obtenir un vecteur logique (de longueur m) qui indique lequel des lignes de Q sont identiques (pour tous les éléments) de la ligne spécifiée r?

Dans le cas de l'échantillon ci-dessus, qui devrait être

[ 1 0 0 1 1 0 ]; 
+0

Très proche de: http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix – neuronet

Répondre

19

Vous pouvez utiliser ismember et de le faire en une seule ligne:

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

ans = 

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

bsxfun(@eq, r, Q) compare chaque rangée et renvoie une matrice avec la même taille que Q:

>> bsxfun(@eq, r, Q) 

ans = 

    1  1  1 
    0  1  1 
    0  0  0 
    1  1  1 
    1  1  1 
    1  1  0 

la fonction all calcule si le Le résultat de bsxfun est vrai sur chaque ligne séparément. Ainsi, il retourne:

>> all(ans,2)' 

ans = 

    1  0  0  1  1  0 

et oui, il y a aussi un opérateur Transpose ' pour correspondre à votre sortie désirée de la ligne

+1

À noter que c'est un peu plus rapide que l'ismembre –

0

façon plus facile avec 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

aussi moins efficace et plus lent, voir: http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/#9 –

+0

L'efficacité là où ce n'est pas nécessaire est une malédiction. La simplicité d'écriture et de compréhension est directement liée à un meilleur code. – Castilho

+0

Qu'est-ce qu'il est si difficile de comprendre à propos de 'bsxfun (@eq, r, Q)' ?? Si vous l'apprenez avec des exemples aussi simples, vous en bénéficierez plus tard lors de l'application sur des problèmes complexes. –

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 
Questions connexes