Azzera filtri
Azzera filtri

How to move elements of vector

17 visualizzazioni (ultimi 30 giorni)
julie st cyr
julie st cyr il 10 Dic 2020
Commentato: julie st cyr il 10 Dic 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 Commento
Fangjun Jiang
Fangjun Jiang il 10 Dic 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.

Accedi per commentare.

Risposta accettata

James Tursa
James Tursa il 10 Dic 2020
Modificato: James Tursa il 10 Dic 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

Più risposte (2)

Ameer Hamza
Ameer Hamza il 10 Dic 2020
Modificato: Ameer Hamza il 10 Dic 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 il 10 Dic 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

Community Treasure Hunt

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

Start Hunting!

Translated by