MATLAB Answers

how to remove zeros from the matrix?

23 views (last 30 days)
Junseob Kim
Junseob Kim on 25 Nov 2019
Commented: Junseob Kim on 25 Nov 2019
Hello, I want to remove zero values from the matrix and cut the last elements of odd rows. For example, if I have a matrix
A=[1, 0, 2, 0, 3 ;
0, 4, 0, 5, 0 ;
6, 0, 7, 0, 8]
and, I want to make matrix like
B=[1, 2;
4, 5;
6, 7]
Please answer this question. Thanks!

  5 Comments

Show 2 older comments
Junseob Kim
Junseob Kim on 25 Nov 2019
And yes. If I have n zeros in odd rows, there are n+1 zeros in even rows.
James Tursa
James Tursa on 25 Nov 2019
Is it always the checkerboard pattern shown?

Sign in to comment.

Accepted Answer

the cyclist
the cyclist on 25 Nov 2019
Edited: the cyclist on 25 Nov 2019
I think this does what you want:
% Replicate A into B
B = A;
% For the even-numbered rows, circularly shift the elements
B(2:2:end,:) = circshift(B(2:2:end,:),-1,2);
% Remove any columnn with a zero
B(:,any(B==0)) = [];

  1 Comment

Sign in to comment.

More Answers (3)

Guillaume
Guillaume on 25 Nov 2019
A=[1, 0, 2, 0, 3 ;
0, 4, 0, 5, 0 ;
6, 0, 7, 0, 8];
B = reshape(nonzeros(A(:, 1:end-1).'), [], size(A, 1)).'

  1 Comment

Sign in to comment.


Adam Danz
Adam Danz on 25 Nov 2019
This approach extracts the first two non-zero elements per row. If there are no two non-zero elements in each row an error is thrown.
A=[
1, 0, 2, 0, 3 ;
0, 4, 0, 5, 0 ;
6, 0, 7, 0, 8];
B=[1, 2;
4, 5;
6, 7];
% Number of non-zeros per row or A
numNonZeros = sum(A~=0,2);
% Replace the non-zeros after the 2nd non-zero in
% each row with 0s
A(cumsum(A~=0,2) > 2) = 0;
% Confirm that we end up with 2 non-0s in each row
if (unique(sum(A~=0,2))>0) ~= true
error('Assumption violation: the number of non-zeros in each row of A is unexpected.')
end
A = A.';
B = reshape(A(A~=0),2,size(A,2)).';

  1 Comment

Sign in to comment.


Kaspar Bachmann
Kaspar Bachmann on 25 Nov 2019
Edited: Kaspar Bachmann on 25 Nov 2019
A=[1, 0, 2, 0, 3 ; 0, 4, 0, 5, 0 ; 6, 0, 7, 0, 8]
Var = A;
Var(:,length(Var)) = [];
for i = 1:size(Var,1)
t = Var(i,:);
idx = find(t>0);
B(i,:) = t(idx);
end
Its a bit messy, but it should work.

  1 Comment

Sign in to comment.

Sign in to answer this question.