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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top