2009-04-27 22 views
8

Supongamos que tengo una matriz 1-por-12 y quiero cambiar el tamaño a una matriz 4-por-3. ¿Cómo podría hacer esto?¿Cómo cambio el tamaño de una matriz en MATLAB?

Mi solución actual es un poco feo:

for n = 1:(length(mat)/3) 
    out(n,1:3) = mat(((n-1)*3 + 1):((n-1)*3 + 3)); 
end 

¿Hay una mejor manera de hacer esto?

Respuesta

24

reshape es, por supuesto, la solución adecuada, como se indica en @gnovice.

Una característica interesante de reshape es que permite esto:

A = 1:12; 
B = reshape(A,4,[]); 
B = 
    1  5  9 
    2  6 10 
    3  7 11 
    4  8 12 

Así que si usted no sabe cuántas columnas habrá, reshape calculará por usted. Del mismo modo, reshape completará el número de filas, si lo deja fuera.

C = reshape(A,[],4) 
C = 
    1  4  7 10 
    2  5  8 11 
    3  6  9 12 
+2

+1: ¡Agradable! De hecho, nunca me di cuenta de eso antes. Supongo que nunca tuve que usarlo. – gnovice

12

Pruebe la función RESHAPE:

A = (1-by-12 matrix); 
B = reshape(A,4,3); 

Tenga en cuenta que la matriz B estará llena de elementos de A de una manera por columnas (es decir, columnas serán llenados de arriba a abajo, moviéndose de izquierda a derecho).

Ejemplo:

>> A = 1:12; 
>> B = reshape(A,4,3) 

B = 

    1  5  9 
    2  6 10 
    3  7 11 
    4  8 12 
+0

Tenga en cuenta que la remodelación devuelve un error si A no tiene exactamente 4 * 3 elementos. – AnnaR

+0

Sí, ese es el comportamiento normal esperado de RESHAPE. – gnovice

+1

¿No podemos decirle a RESHAPE que agregue ceros si no hay exactamente 4 * 3 elementos? Quise decir si hay menos de 12 elementos. –

9

para extender la solución de gnovice:

Si necesita un orden diferente de la construcción de la matriz, el uso de transposición (el "operador) o permute() para cambiar el orden dimensión después de haber llamado reshape().

+0

+1: Buen punto sobre la transposición y PERMUTE. A veces se necesitan después de una remodelación. – gnovice

Cuestiones relacionadas