Efficiently converting a 3d matrix to a 2d matrix

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.

 Respuesta aceptada

the cyclist
the cyclist el 21 de Mzo. de 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)

9 comentarios

Andrew Newell
Andrew Newell el 21 de Mzo. de 2011
Elegant!
converting 3D to 2D matrix row wise
Thank you! Excelent!
Thanks a bunch this is so elegant!
Zoe
Zoe el 24 de Feb. de 2018
Save my life!
IndikaWM
IndikaWM el 5 de Abr. de 2018
mine too! Thank you.
Linjun He
Linjun He el 25 de Dic. de 2018
Thank you!!!
Yue Zhang
Yue Zhang el 23 de Feb. de 2019
Thank you.
Sem Diaz
Sem Diaz el 4 de Dic. de 2019
How can you convert it back?

Iniciar sesión para comentar.

Más respuestas (2)

Andrew Newell
Andrew Newell el 21 de Mzo. de 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
Omar Mian
Omar Mian el 21 de Mzo. de 2011

1 voto

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.

Categorías

Más información sobre Matrices and Arrays en Centro de ayuda y File Exchange.

Productos

Etiquetas

Preguntada:

el 21 de Mzo. de 2011

Comentada:

el 4 de Dic. de 2019

Community Treasure Hunt

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

Start Hunting!

Translated by