Matlab: Найти индекс строки первого появления для каждого столбца матрицы (без использования циклов)
Для каждого столбца матрицы A, состоящей из "0" и "1", я хотел бы найти индексы столбцов первого вхождения "1", если существует. Например, если A определяется как:
A=[0 0 0 0;
0 0 0 1;
0 0 0 0;
0 0 0 1;
1 0 0 0;
0 1 0 1;
1 1 0 0]
тогда результат будет:
b=[5 6 2]
Я ищу решение без каких-либо циклов for или while.
Одно решение я придумал:
[b,~]=find(cumsum(cumsum(A))==1)
Есть ли более элегантный способ сделать это?
2 ответа
Решение
Это короче всего, что написано, и это один вкладыш. Код:
[~,idx] = max(A(:,sum(A)>0));
Выход:
idx =
5 6 2
РЕДАКТИРОВАТЬ: Просто понял, что вы можете сделать:
[~,idx] = max(A(:,any(A)))
@Nacer - хороший ответ. По умолчанию [a,m,c] = unique(J) возвращает вектор m
индексировать последнее вхождение каждого уникального значения в J. [~,m] = unique(J, 'first');
вместо.
[I,J] = find(A==1);
[~,m] = unique(J, 'first');
I(m)
ans =
5
6
2