Найти индекс последнего ненулевого элемента в каждой строке данной матрицы? - PullRequest
11 голосов
/ 12 октября 2010

Для матрицы произвольного размера x, как мне найти индекс последнего ненулевого элемента в каждой строке данной матрицы?

Например, для матрицы

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ]

вектор [ 3 6 0 5 ] должен быть получен.

Ответы [ 4 ]

10 голосов
/ 12 октября 2010

Вот более короткая версия, сочетающая find и accumarray

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ];
%# get the row and column indices for x
[rowIdx,colIdx] = find(x);
%# with accumarray take the maximum column index for every row
v = accumarray(rowIdx,colIdx,[],@max)'
v =
     3   6   0   5
4 голосов
/ 12 октября 2010

Вот одна из версий:

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ];
c = arrayfun(@(k) find(x(k,:)~=0,1,'last'), 1:size(x,1), 'UniformOutput',false);
c( cellfun(@isempty,c) ) = {0};
v = cell2mat(c);

v =
     3     6     0     5

EDIT : Рассмотрим это альтернативное решение:

[m,v] = max( cumsum(x'~=0) );
v(m==0) = 0;

v =
     3     6     0     5
2 голосов
/ 30 июля 2014

Однолинейное решение с bsxfun:

result = max(bsxfun(@times, x~=0, 1:size(x,2)).');

Или используйте два выхода max:

[val, result] = max(fliplr(x~=0).',[],1); %'
result = (size(A,2)+1-result).*val;
1 голос
/ 12 октября 2010

Мой ответ немного искажен, но он тоже должен работать

x = [ 0 9 7 0 0 0; 5 0 0 6 0 3; 0 0 0 0 0 0; 8 0 4 2 1 0 ];
[~,pos] = max([fliplr(x~=0),ones(size(x,1))],[],2);
v = size(x,2)-pos' +1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...