Matlab:每行或每列的第一个非零元素

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];

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


2
如果有一行是“全零”,你会期望什么? - Shai
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 );

这是一个更好的解决方案,因为当处理较大的矩阵时,find函数可能会出错。 - Maddy
如何找到值而不是索引? - fox

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);

1
请注意,您可能需要 accumarray(r,c,[size(A,1),1],@min,NaN),因为在我的 MATLAB 版本中,accumarray 要求尺寸指定为 [M 1] - KQS

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

1
如果一行全是零,那么这将失败。 - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接