2012-05-09 2 views
11

Предположим, что у меня есть матрица (m x 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 ]; 

что это самый простой способ получить логический вектор (длины т), которое указывает, какой из строк в Q являются идентичными (для всех элементов) к указанной строке г?

В случае, приведенном выше примере, который должен быть

[ 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 

и да, есть также транспонированная оператор ', чтобы соответствовать вашему требуемому выходному ROW

+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 
Смежные вопросы