Найти данную строку в матрице

39

У меня есть матрица m по n в MATLAB, скажем M. Я имею вектор строк n-элементов, т.е. одну на n матрицу столбца, например X.

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

Теги:

4 ответа

64
Лучший ответ

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
  • 21
    Вы можете немного изменить свое решение, используя аргумент 'rows' для ISMEMBER, чтобы убрать необходимость в FIND: [~,index] = ismember(X,M,'rows')
  • 0
    @gnovice: спасибо :) Я отредактировал свое решение.
Показать ещё 3 комментария
6

Прежде чем я узнал о ismember, я использовал:

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

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

  • 3
    Это хорошее решение, так как оно возвращает ВСЕ строки матрицы, в которой находится X (в отличие от отмеченного ответа).
  • 1
    Это решение намного быстрее принятого (примерно в 20 раз в больших масштабах - проверено) и возвращает все строки, а не только самый большой индекс.
Показать ещё 1 комментарий
3

Другим решением, которое возвращает индекс строки для каждого вхождения 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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню