## Efficiently converting a 3d matrix to a 2d matrix

### Omar Mian (view profile)

on 21 Mar 2011
Latest activity Commented on by Yue Zhang

on 23 Feb 2019

### the cyclist (view profile)

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

### the cyclist (view profile)

on 21 Mar 2011

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)

IndikaWM

### IndikaWM (view profile)

on 5 Apr 2018
mine too! Thank you.
Linjun He

on 25 Dec 2018
Thank you!!!
Yue Zhang

on 23 Feb 2019
Thank you.

### Andrew Newell (view profile)

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