Simple reformat data question
1 view (last 30 days)
Show older comments
I have
a=[1:16]
and I need to get
b= 1 2 4 3
5 6 8 7
13 14 16 15
9 10 12 11
have a number of such vectors that I want to convert into this format..
0 Comments
Accepted Answer
Thomas
on 5 Apr 2012
There might be a shorter way of doing this but this is a start..
a=[1:16]
b=reshape(a,4,[])'
c=b(:,3)
b(:,3)=[]
b=[b c]
d=b(3,:)
b(3,:)=[]
b=[b;d]
More Answers (2)
Sean de Wolski
on 5 Apr 2012
If you can explain what's going on we might be able to help you with a more general solution. Otherwise, there doesn't appear to be a pattern and the solution is thus:
b = a([1 2 4 3; 5 6 8 7; 13 14 16 15;9 10 12 11])
More per comments
A=reshape(1:16,4,4)'
B = A;
B([end-1 end],:) = B([end end-1],:);
B(:,[end-1 end]) = B(:,[end end-1]);
Matt Tearle
on 5 Apr 2012
How much does this need to generalize? If a might be very long, using a transpose is inefficient. Will the number of elements of a be fixed? If not, will the number of elements of a always be a square (so it can be reshaped into an n-by-n matrix)?
If numel(a) can be large, but will always be square:
A = 1:49; % or whatever
n2 = length(A);
n = sqrt(n2);
idx = mod(0:n:(n*n2-1),n2-1)+1;
B = reshape(A(idx),n,n);
B(n,n) = n2;
B([end-1 end],:) = B([end end-1],:);
B(:,[end-1 end]) = B(:,[end end-1]);
0 Comments
See Also
Categories
Find more on Logical in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!