8

例如,

A = [ -1   0  -2   0   0
   2   8   0   1   0
   0   0   3   0  -2
   0  -3   2   0   0
   1   2   0   0  -4];

如何获得每行的第一个非零元素的向量?

4

3 回答 3

17

您可以使用max

>> [sel, c] = max( A ~=0, [], 2 );

等于零的行sel- 都是零,c应该忽略相应的列。

结果:

>> [sel c]= max( A~=0, [], 2 )

sel =
 1
 1
 1
 1
 1
c =
 1
 1
 3
 2
 1

为了找到第一个非零行索引(对于每一列),您只需要max在第一个维度上应用:

>> [sel r] = max( A~=0, [], 1 );
于 2013-10-28T09:44:43.393 回答
9

这是一个基于accumarray的解决方案,即使一行全为零也可以工作。

A = [ -1   0  -2   0   0
   2   8   0   1   0
   0   0   3   0  -2
   0  -3   2   0   0
   1   2   0   0  -4];

[r,c] = find(A);

%# for every row, take the minimum column index and put NaN if none is found
firstIndex = accumarray(r,c,[size(A,1),1],@min,NaN);
于 2013-10-28T09:35:03.267 回答
1

您可以通过对每一行执行find函数来做到这一点,如下所示:

A = [ -1   0  -2   0   0
   2   8   0   1   0
   0   0   3   0  -2
   0  -3   2   0   0
   1   2   0   0  -4];

% make cell of rows
cellOfRows = num2cell(A, 2);

% apply find function for each row
indexOfFirstNonZeroValues = cellfun(@(row) find(row, 1, 'first'), cellOfRows);


indexOfFirstNonZeroValues =

     1
     1
     3
     2
     1
于 2013-10-27T23:30:27.507 回答