43 votes

Trouver une ligne donnée dans une matrice

J'ai une matrice m par n en MATLAB , disons M. J'ai un vecteur ligne à n éléments, c'est-à-dire une matrice une par n colonnes, disons X.

Je sais que X est une ligne quelque part dans M. Comment puis-je trouver l'index dans M ?

65voto

r.m. Points 25280

ÉDITER:

la suggestion de gnovice est encore plus simple que la mienne :

 [~,indx]=ismember(X,M,'rows')

indx =

     3

PREMIÈRE SOLUTION :

Vous pouvez facilement le faire en utilisant find et ismember . Voici un exemple :

 M=magic(4);        %#your matrix

M =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

X=[9 7 6 12];      %#your row vector

find(ismember(M,X),1)

ans =

     3

8voto

buzjwa Points 2077

Avant d'apprendre ismember , je faisais :

 index = find(all(bsxfun(@eq, M, X), 2));

Mais utiliser ismember(X, M, 'rows') est définitivement préférable.

3voto

Joel Wallman Points 11

Une autre solution qui renvoie un index de ligne pour chaque occurrence de X est

 find(sum(abs(M-ones(rows(M),1)*X),2)==0)

De plus, cette solution peut être facilement adaptée pour trouver des lignes qui se trouvent dans le seuil de X comme suit (si le bruit numérique est un problème)

 tolerance = 1e-16; %setting the desired tolerance
find(sum(abs(M-ones(rows(M),1)*X),2)<tolerance)

1voto

user492238 Points 2478

Il s'agit d'une version sans boucle. Cela ne convient que si M (votre matrice) n'est pas très grand, c'est-à-dire. n et m sont petits. X est votre ligne :

 function ind = findRow(M,X)
    tmp = M - repmat(X,size(M,1),1); 
    ind = find(tmp,1); 
end     

Si M est trop grand, il peut être plus rapide d'itérer les lignes de M et de comparer chaque ligne avec votre vecteur.

@Edit : variables renommées pour correspondre aux noms utilisés dans la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X