Matlab: First Non-zero element of each row or column
14,231
Solution 1
You can use max
:
>> [sel, c] = max( A ~=0, [], 2 );
Rows for which sel
equalse zero - are all zeros and the corresponding column in c
should be ignored.
Result:
>> [sel c]= max( A~=0, [], 2 )
sel =
1
1
1
1
1
c =
1
1
3
2
1
In order to find the first non-zero row index (for each column) you just need to apply max
on the first dimension:
>> [sel r] = max( A~=0, [], 1 );
Solution 2
Here is a solution based on accumarray that will work even if a row is all zeros.
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);
Solution 3
You can do it by executing find function for each row as follows:
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
Author by
user2913990
Updated on June 15, 2022Comments
-
user2913990 about 2 years
For example,
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];
how can I get a vector of the first nonzero elements of each row?
-
Jonas over 10 yearsthis will fail if there is a row of all zeros.
-
Maddy over 10 yearsThis is a better solution as
find
can explode when working larger matrices. -
KQS over 7 yearsFYI, you may need
accumarray(r,c,[size(A,1),1],@min,NaN)
becauseaccumarray
requires the size be specified as[M 1]
(at least in my version of MATLAB)