Remodapa a matriz 3D para 2D Matrix
Pergunta
Eu tenho uma matriz 3D (n-by-m-by-t
) no Matlab representando n-by-m
medições em uma grade por um período de tempo. Eu gostaria de ter uma matriz 2D, onde as informações espaciais se foram e apenas n*m
medições ao longo do tempo t
são deixados (ou seja: n*m-by-t
)
Como posso fazer isso?
Solução
Você precisa do comando reshape
:
Digamos que sua matriz inicial é (só para eu obter alguns dados):
a=rand(4,6,8);
Então, se as duas últimas coordenadas forem espaciais (o tempo é 4, m é 6, n é 8), você usa:
a=reshape(a,[4 48]);
E você acaba com uma matriz 4x48.
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 uma matriz 24x8.
Esta é uma operação rápida, O (1) (apenas ajusta o cabeçalho 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 remodelamento é mais rápida.
Outras dicas
A remodelamento é obviamente a solução padrão para reformular uma matriz. (Como mais eles chamariam?) Ainda existem alguns truques para descobrir.
Primeiro de tudo, a maneira mais simples de transformar uma variedade de tamanho [n, m, p] em uma variedade de tamanho [n*m, p]?
B = reshape(A,n*m,p);
Mas melhor é o seguinte:
B = reshape(A,[],p);
Se você deixar um dos argumentos para remodelar vazio, remodele o tamanho para você! Tenha cuidado, se você tentar isso e o tamanho de A não estiver em conformidade, você receberá um erro. Desta forma:
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 uma matriz de duas colunas a partir de algo que tenha 9 elementos. Eu coloquei uma função chamada lessa Na troca central do MATLAB, que seria necessário como necessário para fazer essa operação sem nenhum erro gerado.
Claro, você sempre pode usar truques como
B = A(:);
Para criar um vetor diretamente a partir de uma matriz. Isso é equivalente à forma
B=reshape(A,[],1);
Uma solução melhor para esse problema é usar o NShape.m disponível na caixa de ferramentas N-Way do Rasmus Bro. Isso permitirá que você remodele ao longo de um determinado modo, o que é um pouco mais complicado com o comando remodelador.
A caixa de ferramentas está disponível no seguinte link:
https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox
Existem outras excelentes ferramentas lá para ajudar na manipulação da matriz também.