Removing zeros from matrix

73 visualizzazioni (ultimi 30 giorni)
Robert Bridges
Robert Bridges il 7 Dic 2021
Modificato: Stephen23 il 7 Dic 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]
Thanks in advance.
Edit:
The final desired output would be:
B = [6; 6; 5; 4; 3]

Risposta accettata

Stephen23
Stephen23 il 7 Dic 2021
Modificato: Stephen23 il 7 Dic 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

Più risposte (2)

Alan Stevens
Alan Stevens il 7 Dic 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
  3 Commenti
Stephen23
Stephen23 il 7 Dic 2021
Every row must have the same number of elements, so this is not a valid matrix:
B = [1 2 3 4 5 6; 1 2 3 4 5 6; 1 2 3 4 5; 1 2 3 4; 1 2 3]
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
Would you like to replace the zeros with NaNs instead?
Robert Bridges
Robert Bridges il 7 Dic 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.

Accedi per commentare.


Jan
Jan il 7 Dic 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
  1 Commento
Robert Bridges
Robert Bridges il 7 Dic 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.

Accedi per commentare.

Prodotti

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by