2012-05-09 10 views
11

Supongamos que tengo una (m x n) matriz Q, y un vector de fila r, p.buscando filas coincidentes en la matriz

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

r = [ 1 2 3 ]; 

¿Cuál es la forma más fácil de obtener un vector lógico (de longitud m) que indica cuál de las filas de Q son idénticos (para todos los elementos) para la fila especificada r?

En el caso del ejemplo anterior, que debe ser

[ 1 0 0 1 1 0 ]; 
+0

Muy relacionado con: http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix – neuronet

Respuesta

19

Puede utilizar ismember y hacerlo en una sola línea:

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

ans = 

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

bsxfun(@eq, r, Q) compara cada fila y devuelve una matriz con mismo tamaño 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 función all calcula si el El resultado de bsxfun es verdadero a lo largo de cada fila por separado. De este modo se vuelve:

>> all(ans,2)' 

ans = 

    1  0  0  1  1  0 

y sí, también hay un operador de transposición ' para que coincida con la salida de fila deseada

+1

Vale la pena señalar que esto es bastante más rápido que el miembro –

0

manera más fácil 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

también menos eficiente y más lento, ver: http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/#9 –

+0

Eficiencia donde no se necesita es una maldición. La simplicidad para escribir y comprender se relaciona directamente con un mejor código. – Castilho

+0

¿Qué es tan difícil de entender sobre 'bsxfun (@eq, r, Q)' ?? Si lo aprende con ejemplos tan fáciles, se beneficiará más adelante al aplicar problemas complejos. –

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 
Cuestiones relacionadas