Simple reformat data question

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..

 采纳的回答

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]

更多回答(2 个)

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]);

2 个评论

I have to exchange the last and second last row and last and second last column. This is ok for the example matrix, but I have a number of such vectors that I need to reformat.. I'm trying the above solution by Thomas..

请先登录,再进行评论。

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]);

类别

帮助中心File Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息

产品

标签

Community Treasure Hunt

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

Start Hunting!

Translated by