对于一个任意大小的矩阵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 ]
。
对于一个任意大小的矩阵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 ]
。
这里有一个更短的版本,结合了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
以下是一种版本:
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
编辑: 考虑使用以下替代方案:
[m,v] = max( cumsum(x'~=0) );
v(m==0) = 0;
v =
3 6 0 5
~=
是逐元素的不等式运算符。转置只是一个细节,我们可以明确指定要处理的维度:[m,v] = max(cumsum(x~=0,2),[],2)
。下一行处理了所有元素都为零的行的情况。 - Amro我的答案有点扭曲,但也应该能行
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;