2012-05-09 15 views
11

Supponiamo di avere una matrice (m x n) Q e un vettore di riga r, ad es.trovare le righe corrispondenti nella matrice

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

r = [ 1 2 3 ]; 

Qual è il modo più semplice per ottenere un vettore logico (di lunghezza m), che indica quale delle righe Q sono identiche (per tutti gli elementi) alla riga r specificato?

Nel caso di esempio di cui sopra, che dovrebbe essere

[ 1 0 0 1 1 0 ]; 
+0

Molto strettamente correlato a: http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix – neuronet

risposta

19

È possibile utilizzare ismember e farlo in una sola riga:

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

ans = 

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

bsxfun(@eq, r, Q) confronta ogni riga e restituisce una matrice con stessa dimensione D:

>> bsxfun(@eq, r, Q) 

ans = 

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

la funzione all calcola se la il risultato di bsxfun è tutto vero su ogni riga separatamente. Così ritorna:

>> all(ans,2)' 

ans = 

    1  0  0  1  1  0 

e sì, c'è anche un operatore di trasposizione ' per abbinare l'output riga desiderata

+1

Vale la pena notare che questo è un po 'più veloce di quello che è –

0

facile strada con 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

anche meno efficiente e più lento, vedi: http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/#9 –

+0

L'efficienza dove non serve è una maledizione. La semplicità di scrivere e capire riguarda direttamente il codice migliore. – Castilho

+0

che cosa è così difficile da capire su 'bsxfun (@eq, r, Q)' ?? Se lo impari con esempi così semplici, ne trarrai vantaggio in seguito quando applicherai problemi complessi. Readability –

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 
Problemi correlati