2009-04-27 9 views
8

Angenommen, ich hätte eine 1-by-12 Matrix und ich wollte die Größe zu einer 4-by-3 Matrix ändern. Wie könnte ich das tun?Wie ändere ich die Größe einer Matrix in MATLAB?

Meine aktuelle Lösung ist ein bisschen hässlich:

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

Gibt es einen besseren Weg, dies zu tun?

Antwort

24

reshape ist natürlich die richtige Lösung, wie von @gnovice angegeben.

Ein nettes Feature von reshape ist, dass es dies ermöglicht:

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

Also, wenn Sie nicht wissen, wie viele Spalten da sein, reshape wird es für Sie berechnen. Ebenso wird reshape die Anzahl der Zeilen ausfüllen, wenn Sie das auslassen.

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

+1: Nett! Das habe ich vorher nie bemerkt. Ich glaube, ich musste es nie benutzen. – gnovice

12

Versuchen die RESHAPE Funktion:

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

anzumerken, dass die Matrix B wird mit Elementen aus A in einer spaltenweisen Art und Weise (dh Spalten von oben nach unten gefüllt werden gefüllt werden, auf bewegte links Recht).

Beispiel:

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

B = 

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

Beachten Sie, dass die Umformung einen Fehler zurückgibt, wenn A nicht genau 4 * 3 Elemente hat. – AnnaR

+0

Ja, das ist das normale erwartete Verhalten von RESHAPE. – gnovice

+1

Können wir RESHAPE nicht bitten, Nullen hinzuzufügen, wenn es keine genau 4 * 3 Elemente gibt? Ich meinte, wenn es weniger als 12 Elemente gibt. –

9

gnovice-Lösung zu erweitern:

Wenn Sie eine andere Reihenfolge der Matrixkonstruktion benötigen, verwenden Sie transponieren (der "Betreiber) oder permute() die Dimension Bestellung zu ändern, nachdem Sie angerufen haben reshape().

+0

+1: Guter Punkt zum Transponieren und PERMUTE. Diese werden manchmal nach einer Umformung benötigt. – gnovice