MATLAB Answers

How to move elements of vector

57 views (last 30 days)
julie st cyr
julie st cyr on 10 Dec 2020
Commented: julie st cyr on 10 Dec 2020
How would I be able to find certain elements of a vector and move them?
For example, fidning the zeros in a vector and moving them to the right,
so [6 0 9 4; 0 4 0 6; 7 0 8 6; 4 5 0 9]
becomes [6 9 4 0; 4 6 0 0; 7 8 6 0; 4 5 9 0]
I have tried
vec = [vec(vec~=0) vec(vec==0)] but was unsuccessful.
Any help is appreciated thank you!
  1 Comment
Fangjun Jiang
Fangjun Jiang on 10 Dec 2020
Because there are diffferent number of zeros in each row, I think you need to go through a for-loop, do it row by row should be relatively easy.

Sign in to comment.

Accepted Answer

James Tursa
James Tursa on 10 Dec 2020
Edited: James Tursa on 10 Dec 2020
Could use a loop on the rows with logical indexing. E.g.,
vec = whatever
z = (vec == 0);
for r=1:size(vec,1)
vec(r,:) = [vec(r,~z(r,:)) vec(r,z(r,:))];
end
  1 Comment
julie st cyr
julie st cyr on 10 Dec 2020
Just what I was looking for thank you so much!

Sign in to comment.

More Answers (2)

Ameer Hamza
Ameer Hamza on 10 Dec 2020
Edited: Ameer Hamza on 10 Dec 2020
Try this
M = [6 0 9 4; 0 4 0 6; 7 0 8 6; 4 5 0 9];
[~, cols] = sort(M==0,2);
rows = repmat((1:size(M,1)).', 1, size(M,2));
M_new = M(sub2ind(size(M), rows, cols));
Result
>> M_new
M_new =
6 9 4 0
4 6 0 0
7 8 6 0
4 5 9 0

jessupj
jessupj on 10 Dec 2020
i can't think of how you might do this without a loop and maintain the matrix form. but your approach will work row-by-row
for k=1:size(vec,2);
vec(k,:) = [vec(k, vec(k,:)~=0) vec(k, vec(k,:)==0) ];
end

Tags

Community Treasure Hunt

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

Start Hunting!