How to rearrange rows in specific intervals

I have a matrix like so:
[x1 y1 z1;
x2 y2 z2;
x3 y3 z3;
x1 y1 z1;
x2 y2 z2;
x3 y3 z3;
x1 y1 z1;
x2 y2 z2;
x3 y3 z3]
Is there a non-loop solution to reorder the matrix to:
[x1 y1 z1;
x1 y1 z1;
x1 y1 z1;
x2 y2 z2;
x2 y2 z2;
x2 y2 z2;
x3 y3 z3;
x3 y3 z3;
x3 y3 z3]
In other words get every third column (in this case) and set them in order. The final matrix would end up being the same size.
I appreciate any help possible.

 Accepted Answer

I use the Symbolic Math Toolbox to illustrate the approach and the desired result:
syms x1 y1 z1 x2 y2 z2 x3 y3 z3 real
M = [x1 y1 z1;
x2 y2 z2;
x3 y3 z3;
x1 y1 z1;
x2 y2 z2;
x3 y3 z3;
x1 y1 z1;
x2 y2 z2;
x3 y3 z3];
A = reshape(M, 3, 3, []);
B = permute(A, [3 2 1]);
Result = reshape(B, 3, [])'
Result =
[ x1, y1, z1]
[ x1, y1, z1]
[ x1, y1, z1]
[ x2, y2, z2]
[ x2, y2, z2]
[ x2, y2, z2]
[ x3, y3, z3]
[ x3, y3, z3]
[ x3, y3, z3]

More Answers (1)

A = [1 2 3 ; 4 5 6 ; 7 8 9 ; 1 2 3 ; 4 5 6 ;7 8 9 ; 1 2 3 ; 4 5 6 ; 7 8 9] ;
[val,idx] = sort(A(:,1)) ;
B = A(idx,:)

2 Comments

What if the values of the matrix are not in order? suppose a random matrix.
Same thing works.......provided the random matrix is given in the way the matrix is.
x1 = rand ; y1 = rand ;z1 = rand ;
x2 = rand ; y2 = rand ;z2 = rand ;
x3 = rand ; y3 = rand ;z3 = rand ;
A = [x1 y1 z1; x2 y2 z2; x3 y3 z3; x1 y1 z1; x2 y2 z2; x3 y3 z3; x1 y1 z1; x2 y2 z2; x3 y3 z3] ;
[val,idx] = sort(A(:,1)) ;
B = A(idx,:)

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!