2013-06-24 2 views
6

In Matlab, können wir über Dimensionen eines Array wie folgt zusammenbrechen:Wie reduziere ich ein Array über einen bestimmten Satz von Dimensionen?

M  = rand(3,4,5); 
myvec = M(:);  % gives a 60-element vector 

Ich denke, es heißt Serialisierung oder Abflachung. Die Reihenfolge der Elemente ist zuerst dim1, dann dim2, dann dim3 - so erhalten Sie [M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...].

Aber was ich tun möchte, ist Kollaps nur entlang den ersten zwei Dimensionen:

mymatrix = M(:: , :); % something that works like this? 

eine 12 x 5 Matrix zu geben. So zum Beispiel, erhalten Sie

[M(1,1,1) M(1,1,2) M(1,1,3) M(1,1,4) M(1,1,5) 
M(2,1,1) M(2,1,2) M(2,1,3) M(2,1,4) M(2,1,5) 
M(3,1,1) M(3,1,2) M(3,1,3) M(3,1,4) M(3,1,5) 
M(1,2,1) M(1,2,2) M(1,2,3) M(1,2,4) M(1,2,5) 
... 
] 

so dass die erste Dimension der mymatrix ist die „abgeflacht“ 1. und 2. Abmessungen des Originals M, aber alle anderen Dimensionen zu erhalten.

Eigentlich muss ich dies für die "mittleren 3 Dimensionen" eines 5-dimensionalen Arrays tun, also wäre eine allgemeine Lösung großartig! z.B. W=rand(N,N,N,N,N); mymatrix = W(:, :::, :) sollte eine N x N^3 x N Matrix geben, wenn Sie sehen, was ich meine.

Dank

Antwort

5

Verwenden reshape mit eckigen Klammern ([]) als Platzhalter für eine der Dimension Länge Argumente:

sz = size(M); 
mymatrix = reshape(M, [], sz(end));  % # Collapse first two dimensions 

oder

mymatrix = reshape(M, sz(1), [], sz(end)); % # Collapse middle dimensions 

der Platzhalter []reshape zu berechnen sagt die Größe automatisch. Beachten Sie, dass Sie nur ein einziges Vorkommen von [] verwenden können. Alle anderen Dimensionslängen müssen explizit angegeben werden.

+0

Perfekter Dank! Sollte über eine Umgestaltung nachgedacht haben. PS Ich habe gerade an einen anderen Weg gedacht, der zu funktionieren scheint: 'tmp = permute (M, [1,5,2,3,4]);', 'mymatrix = tmp (:, :)'. Nicht sicher, ob es immer funktioniert? Natürlich ist "Umgestaltung" ** viel ** vorzuziehen. –

Verwandte Themen