Remodele a matriz 3d para a matriz 2d

Eu tenho uma matriz 3D ( n-by-m-by-t ) no MATLAB representando n-by-m medições em uma grade durante um período de tempo. Eu gostaria de ter uma matriz 2d, onde a informação espacial se foi e apenas n*m medições ao longo do tempo t são deixadas (ou seja: n*m-by-t )

Como posso fazer isso?

Você precisa do comando reshape :

Diga que sua matriz inicial é (apenas para eu obter alguns dados):

 a=rand(4,6,8); 

Então, se as duas últimas coordenadas são espaciais (o tempo é 4, m é 6, n é 8) você usa:

 a=reshape(a,[4 48]); 

e você acaba com um array 4×48.

Se os dois primeiros são espaciais e o último é o tempo (m é 4, n é 6, o tempo é 8) você usa:

 a=reshape(a,[24 8]); 

e você acaba com um array 24×8.

Esta é uma operação rápida, O (1) (apenas ajusta o header de qual é a forma dos dados). Existem outras maneiras de fazer isso, por exemplo, a=a(:,:) para condensar as duas últimas dimensões, mas a reformulação é mais rápida.

A reformulação é, naturalmente, a solução padrão para remodelar um array. (O que mais eles chamam isso?) Ainda há alguns truques para descobrir.

Primeiro de tudo, a maneira mais simples de transformar uma matriz de tamanho [n, m, p] em uma matriz de tamanho [n * m, p]?

 B = reshape(A,n*m,p); 

Mas melhor é isso:

 B = reshape(A,[],p); 

Se você deixar um dos argumentos para reformular vazio, então reformular calcula o tamanho para você! Tenha cuidado, se você tentar isso e o tamanho de A não estiver de acordo, você receberá um erro. Portanto:

 reshape(magic(3),[],2) ??? Error using ==> reshape Product of known dimensions, 2, not divisible into total number of elements, 9. 

Logicamente, não podemos criar um array com duas colunas de algo que tenha 9 elementos. Eu coloquei uma function chamada wreshape na troca do MATLAB Central que seria preenchida conforme necessário para fazer essa operação sem gerar erros.

Claro, você sempre pode usar truques como

 B = A(:); 

para criar um vetor diretamente de uma matriz. Isso é equivalente ao formulário

 B=reshape(A,[],1); 

Uma solução melhor para este problema é usar o nshape.m disponível na N-Way Toolbox da Rasmus Bro. Isso permitirá que você reformule ao longo de um determinado modo, o que é um pouco mais complicado com o comando reshape.

A checkbox de ferramentas está disponível no seguinte link:

https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox

Existem outras ferramentas excelentes para ajudar na manipulação de array também.