2017-05-18 13 views
1

Kann jemand etwas Licht in die Frage bringen, wie diese for-Schleife durch einen einzigen Befehl in MATLAB ersetzt werden kann?3D-Matrix Indizierung mit 2D-Matrix

for i = 1 : size(w,3) 
    x=w(:,:,i); 
    w1(i,:)=x(B(i),:); 
end 
clear x 

Hier w ist ein 3D (x by y by z) -Matrix und B (1 by z) ein Vektor Zeilen enthalten in w zu jeder Schicht gehören. Diese for-Schleife dauert ungefähr 150 Sekunden, um ausgeführt zu werden, wenn w Schichten tief ist. Ich habe versucht, mit,

Q = w(B,:,:); 
Q = reshape(Q(1,:),[500000,2])'; 

Diese eine Matrix Q der Größe 500000 X 2 X 500000 und MATLAB warf mir eine Fehlermeldung, Speicher aus gebundenen schafft. Jede Hilfe wäre willkommen!

+0

Hat meine Antwort für Sie funktioniert? Wenn ja, bitte als akzeptiert markieren. –

Antwort

0

Sie erstellen Zwischenvariablen (z. B. x) und verwenden eine for-Schleife. Die Kernidee des folgenden Ansatzes besteht darin, zuerst die verwendeten Indizes vorzufüllen und dann mit linearer Indexierung auf alle Elemente gleichzeitig zuzugreifen. Dann können wir umgestalten, um das gewünschte Ergebnis zu erhalten.

ind = [B(1)*ones(size(w,2),1) (1:size(w,2)).' 1*ones(size(w,2),1)]; 
ind = [ind; [B(2)*ones(size(w,2),1) (1:size(w,2)).' 2*ones(size(w,2),1)]]; 
ind = [ind; [B(3)*ones(size(w,2),1) (1:size(w,2)).' 3*ones(size(w,2),1)]]; 
lin_ind = sub2ind(size(w), ind(:,1), ind(:,2), ind(:,3)); 
w1 = reshape(w(lin_ind),size(w,2),size(w,3)).' 

Auf meinem System paßt diese w1 mit der Schleife in Ihrer Frage angegeben berechnet. Beachten Sie, dass Sie möglicherweise eine for-Schleife verwenden müssen, um die Indizes vorzufüllen. Ich habe drei Ausdrücke geschrieben, seit ich mit kleinen Matrizen experimentiert habe. Tatsächlich können die ersten drei Zeilen so geschrieben werden, dass Sie überhaupt keine Schleifen brauchen und es funktioniert immer noch mit jeder Größe. Das werde ich dir überlassen.