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
Другие вопросы по тегам