MATLAB Answers

3

Efficiently converting a 3d matrix to a 2d matrix

Asked by Omar Mian on 21 Mar 2011
Latest activity Commented on by Yue Zhang on 23 Feb 2019
Hello,
I would like to convert a 3d matrix into a 2d matrix. I want the 3rd dimension to be concatenated along dimension 1 in the 2d matrix. In the code below, the variable 'desired' illustrates what I want to achieve, but I want to do it more efficiently than via a for a loop. I tried doing the same with reshape (see variable B) but can't get it to produce the output I desire.
A(:,:,1) = ones(2,2);
A(:,:,2) = 2*ones(2,2);
A(:,:,3) = 3*ones(2,2);
desired = [];
for n = 1:size(A,3)
desired = cat(1,desired,A(:,:,n));
end
B = reshape(A,[],size(A,2),1);
Any advice would be much appreciated. Thanks for reading.

  0 Comments

Sign in to comment.

Products

3 Answers

Answer by the cyclist
on 21 Mar 2011
 Accepted Answer

You can permute the 2nd and 3rd dimension before doing the reshape:
>> C = permute(A,[1 3 2]);
>> C = reshape(C,[],size(A,2),1)

  8 Comments

mine too! Thank you.
Thank you!!!

Sign in to comment.


Answer by Andrew Newell
on 21 Mar 2011

You can do it with cell arrays:
Acell = num2cell(A,[1 2]); % put each page of A into a cell
Acell = reshape(Acell,size(A,3),1); %make the cell array a vector
desired = cell2mat(Acell);
EDIT: the solution by @the cyclist is nicer for this particular problem, but be careful about generalizing it. For example, suppose you want to pack your matrices into a 2x2 array:
A(:,:,1) = ones(2,2);
A(:,:,2) = 2*ones(2,2);
A(:,:,3) = 3*ones(2,2);
A(:,:,4) = 4*ones(2,2);
Acell = num2cell(A,[1 2]);
Acell = reshape(Acell,2,2);
desired = cell2mat(Acell)
desired =
1 1 3 3
1 1 3 3
2 2 4 4
2 2 4 4
C = permute(A,[1 3 2]);
C = reshape(C,[],4,1)
C =
1 3 1 3
1 3 1 3
2 4 2 4
2 4 2 4

  0 Comments

Sign in to comment.


Answer by Omar Mian on 21 Mar 2011

Thank you Andrew & cyclist,
Both solutions work. Cyclist's permute solution is more efficient, taking approx approx 17% of the time used by the cell array solution.

  0 Comments

Sign in to comment.