How to move elements of vector

31 Ansichten (letzte 30 Tage)
julie st cyr
julie st cyr am 10 Dez. 2020
Kommentiert: julie st cyr am 10 Dez. 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 Kommentar
Fangjun Jiang
Fangjun Jiang am 10 Dez. 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.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

James Tursa
James Tursa am 10 Dez. 2020
Bearbeitet: James Tursa am 10 Dez. 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 Kommentar
julie st cyr
julie st cyr am 10 Dez. 2020
Just what I was looking for thank you so much!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Ameer Hamza
Ameer Hamza am 10 Dez. 2020
Bearbeitet: Ameer Hamza am 10 Dez. 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 am 10 Dez. 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

Kategorien

Mehr zu Standard File Formats finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by