У меня есть матрица m по n в MATLAB
, скажем M. Я имею вектор строк n-элементов, т.е. одну на n матрицу столбца, например X.
Я знаю, что X - это строка где-то в M. Как найти индекс в M?
предложение 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
Прежде чем я узнал о ismember
, я использовал:
index = find(all(bsxfun(@eq, M, X), 2));
Но использование ismember(X, M, 'rows')
определенно предпочтительнее.
Другим решением, которое возвращает индекс строки для каждого вхождения 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)
Это неконтурная версия. Это подходит, только если 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: переименованные переменные соответствуют именам, используемым в вопросе.
'rows'
для ISMEMBER, чтобы убрать необходимость в FIND:[~,index] = ismember(X,M,'rows')