the repmat que numel number not must hace change matlab matrix reshape

matlab - repmat - Reformar la matriz 3d a la matriz 2d



to reshape the number of elements must not change. (3)

Tengo una matriz 3d ( n-by-m-by-t ) en MATLAB que representa mediciones n-by-m en una grilla durante un período de tiempo. Me gustaría tener una matriz 2d, donde la información espacial se ha ido y solo quedan n*m medidas en el tiempo t (es decir: n*m-by-t )

¿Cómo puedo hacer esto?


Necesitas el comando reshape :

Diga que su matriz inicial es (solo para mí 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) usted usa:

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

y terminas con una matriz 4x48.

Si los dos primeros son espaciales y el último es el tiempo (m es 4, n es 6, el tiempo es 8), usted usa:

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

y terminas con una matriz de 24x8.

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


Remodelar 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 esto:

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

Si deja uno de los argumentos para remodelar el vacío, ¡entonces la remodelación calcula el tamaño para usted! Tenga cuidado, si prueba esto y el tamaño de A no se ajusta, entonces obtendrá un error. Así:

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 el intercambio central de MATLAB que rellenaría según sea necesario para hacer esta operación sin generar ningún error.

Por supuesto, siempre puedes usar trucos como

B = A(:);

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

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


Una mejor solución para este problema es usar nshape.m disponible en la N-Way Toolbox de Rasmus Bro. 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

Existen algunas otras herramientas excelentes para ayudar con la manipulación de arreglos también.