Поиск совпадающих строк в матрице

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

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

В вышеприведенном примере это должно быть

[ 1 0 0 1 1 0 ];

Ответ 1

Вы можете использовать ismember и сделать это в одной строке:

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

ans =

     1     0     0     1     1     0

Ответ 2

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 равен true по каждой строке отдельно. Таким образом, он возвращает:

>> all(ans,2)'

ans =

   1     0     0     1     1     0

и да, существует также оператор транспонирования ' для соответствия вашему желаемому выходу строки

Ответ 3

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

Ответ 4

Простой способ с 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)'