Removing zeros from matrix

11 views (last 30 days)
Robert Bridges on 7 Dec 2021
Edited: Stephen on 7 Dec 2021
Hi,
Been trying to remove these zeros using NaN and find etc. but to no avail.
Trying to remove zeros so that I can pull out the end (non-zero) values from each row and put into a new n:1 matrix. If there is also a way of doing this without nessisarily having to remove the zeros then that would be fine also.
Example matrix (mine is a lot larger but follows similar format with zeros being at the end of the rows):
A = [1 2 3 4 5 6; 1 2 3 4 5 6; 1 2 3 4 5 0; 1 2 3 4 0 0; 1 2 3 0 0 0]
Edit:
The final desired output would be:
B = [6; 6; 5; 4; 3]

Stephen on 7 Dec 2021
Edited: Stephen on 7 Dec 2021
A = [1,2,3,4,5,6;1,2,3,4,5,6;1,2,3,4,5,0;1,2,3,4,0,0;1,2,3,0,0,0]
A = 5×6
1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 0 1 2 3 4 0 0 1 2 3 0 0 0
Method one: NONZEROS and CELLFUN
baz = @(v)v(end);
fnh = @(v)baz(nonzeros(v));
B = cellfun(fnh,num2cell(A,2))
B = 5×1
6 6 5 4 3
Method two: ROT90 and CUMSUM and logical indexing
tmp = rot90(A);
idx = tmp~=0;
idx = idx & cumsum(idx,1)==1;
B = tmp(idx)
B = 5×1
6 6 5 4 3
Method 3: FIND and CELLFUN
foo = @(v)v(find(v,1,'last'));
B = cellfun(foo,num2cell(A,2))
B = 5×1
6 6 5 4 3
Method 4: MAX and SUB2IND and linear indexing:
sza = size(A);
idc = max((A~=0).*(1:sza(2)),[],2);
idr = 1:sza(1);
B = A(sub2ind(sza,idr(:),idc))
B = 5×1
6 6 5 4 3

Alan Stevens on 7 Dec 2021
Like this?
A = [1 2 3 4 5 6; 1 2 3 4 5 6; 1 2 3 4 5 0; 1 2 3 4 0 0; 1 2 3 0 0 0];
B = A'; B=B(:);
B(B==0)=[]
B = 24×1
1 2 3 4 5 6 1 2 3 4
Robert Bridges on 7 Dec 2021
Yes, NaNs would work as long as afer this I can take the final real value from each row and input this into a new matix.
I've edited the question to include the final matrix B.

Jan on 7 Dec 2021
What is the wanted output?
A = [1 2 3 4 5 6; 1 2 3 4 5 6; 1 2 3 4 5 0; 1 2 3 4 0 0; 1 2 3 0 0 0];
B1 = A;
B1(B1 == 0) = NaN
B1 = 5×6
1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 NaN 1 2 3 4 NaN NaN 1 2 3 NaN NaN NaN
B2 = A(A~=0)
B2 = 24×1
1 1 1 1 1 2 2 2 2 2
I'm not sure what this means: "pull out the end (non-zero) values from each row and put into a new n:1 matrix"
Maybe:
B = cell(height(A), 1);
for k = 1:height(A)
B{k} = A(k, A(k, :) ~= 0);
end
Robert Bridges on 7 Dec 2021
The final wanted output would be:
B = [6; 6; 5; 4; 3]
Using NaN's to get to this or other means isn't a problem
Edited in Question now.