Найти данную строку в матрице - PullRequest
42 голосов
/ 02 июня 2011

У меня есть матрица размером m на n в MATLAB, скажем М. У меня есть вектор строки из n элементов, то есть матрица один на n, скажем, X.

Я знаю, что X - это строкагде-то в М. Как я могу найти индекс в М?

Ответы [ 4 ]

65 голосов
/ 02 июня 2011

EDIT:

предложение gnovice даже проще, чем мое:

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

indx =

     3

ПЕРВОЕ РЕШЕНИЕ:

Вы можете легко сделать это, используя find и ismember. Вот пример:

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
7 голосов
/ 08 марта 2015

До того как я узнал о ismember, я обычно делал:

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

Но использование ismember(X, M, 'rows') определенно предпочтительнее.

3 голосов
/ 11 января 2014

Другое решение, которое возвращает индекс строки для каждого вхождения X, это

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

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

tolerance = 1e-16; %setting the desired tolerance
find(sum(abs(M-ones(rows(M),1)*X),2)<tolerance)
1 голос
/ 02 июня 2011

Это версия без петель.Это подходит только, если M (ваша матрица) не очень велика, т.е.п и м маленькие.X - это ваша строка:

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

Если M слишком велико, может быть быстрее выполнить итерацию строк M и сравнить каждую строку с вашим вектором.

@ Edit: переименованные переменныечтобы соответствовать именам, использованным в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...