2010-02-13 10 views
23

Tengo una matriz 3d (n-by-m-by-t) en MATLAB que representa n-by-m mediciones en una cuadrícula durante un período de tiempo. Me gustaría tener una matriz 2D, donde la información espacial se ha ido y sólo n*m mediciones en el tiempo t están a la izquierda (es decir: n*m-by-t)Cambiar la forma de la matriz 3d a la matriz 2d

¿Cómo puedo hacer esto?

Respuesta

28

Se necesita el comando reshape:

Digamos que su matriz inicial es (sólo para mí para obtener algunos datos):

a=rand(4,6,8); 

Entonces, si las dos últimas coordenadas son espaciales (el tiempo es 4, m es 6, n es 8) utiliza:

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

y termina con una matriz 4x48.

Si los dos primeros son espacial y el último es el tiempo (m es 4, n es 6, el tiempo es 8) que utilice:

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

y se termina con una matriz de 24x8.

Esta es una operación O (1) rápida (simplemente ajusta el encabezado de lo que es la forma de los datos). Hay otras formas de hacerlo, p. a=a(:,:) para condensar las dos últimas dimensiones, pero la remodelación es más rápida.

11

La remodelación es, por supuesto, la solución estándar para remodelar una matriz. (¿Qué otra cosa llamarían?) Todavía hay algunos trucos para descubrir.

En primer lugar, ¿la forma más sencilla de convertir una matriz de tamaño [n, m, p] en una matriz de tamaño [n * m, p]?

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

Pero mejor es la siguiente:

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

Si deja uno de los argumentos para formar de nuevo vacía, entonces remodelar calcula el tamaño para usted! Tenga cuidado, si prueba esto y el tamaño de A no se ajusta, entonces obtendrá un error. Por lo tanto:

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

Lógicamente, no podemos crear una matriz con dos columnas de algo que tenga 9 elementos. Puse una función llamada wreshape en la central de MATLAB Central que rellenaría según sea necesario para realizar esta operación sin generar ningún error.

Por supuesto, siempre se puede utilizar trucos como

B = A(:); 

para crear un vector directamente a partir de una matriz. Esto es equivalente a la forma

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

Una mejor solución a este problema es utilizar nshape.m disponible de Rasmus Bro N-Way Toolbox. Eso le permitirá cambiar la forma a lo largo de un modo determinado, lo cual es un poco más complicado con el comando de remodelación.

La caja de herramientas está disponible en el siguiente enlace:

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

Hay algunas otras herramientas excelentes allí para ayudar con la manipulación de matrices también.

Cuestiones relacionadas