How to reshape matrix without loop?

Want to rearrange the matrix A(a,b,c,d) to B(b,c1,c2,d,a), where a,b,c,d are dimensions, c=c1*c2. If known c1=3, for example, B should be:
[a,b,c,d]=size(A);
C=permute(A,[2,3,4,1]);
c2=fix(c/c1);
B=zeros(b,c1,c2,d,a);
for nc=1:c1
B(:,nc,:,:,:)=C(:,nc:c1:end,:,:);
end
Can it be done more elegantly and without the loop?

Risposte (1)

WTP? Effectively two lines, one more to get the size of A if you don't know it already.
[a,b,c,d] = size(A);
B = reshape(A,[a,b,c1,c/c1,d]);
B = permute(B,[2 3 4 5 1]);
There is no need to use fix, because if c is not exactly divisible by c1, then A won't have the correct number of elements for a reshape anyway.

1 Commento

John
John il 26 Lug 2017
Modificato: John il 26 Lug 2017
Hi, John: Will this make the dimension c1 to be the index (1,4,7,10...),(2,5,8,11...), (3,6,9,12...) from c respectively? Thanks.

Accedi per commentare.

Categorie

Prodotti

Richiesto:

il 26 Lug 2017

Modificato:

il 26 Lug 2017

Community Treasure Hunt

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

Start Hunting!

Translated by