2016-07-19 13 views
1

Ich habe ein 3D-Array (Bild) mit den Abmessungen 256 x 3527 x 8. Ich wünsche alle Werte durch einen Vektor von 1 durch die 3. Dimension teilen bis 8.MATLAB: 3D-Array Division durch 1D Vektor

Zum Beispiel mein Vektor wie folgt aussieht:

Esun = [1 2 3 4 5 6 7 8] 

In jeder Schicht des Bildes der Größe 256 x 3527 (von 8 Schichten), möchte ich es durch den entsprechenden Wert in Esun teilen.

Wenn MATLAB keine solche Funktion hat, wird es schneller sein, mein 3D-Array in 8 Teile zu schneiden und es durch eine Schleife zu führen, oder Esun in ein 3D-repetitives Array umzuwandeln und eine Matrix-Division zu erstellen?

Antwort

1

Bitte nicht arrayfun verwenden, da es im Wesentlichen eine Schleife ist. Verwenden Sie den mächtigen bsxfun statt mit permute kombiniert:

Esun = 1:8; % Esun = [1 2 3 4 5 6 7 8]; 
B = bsxfun(@rdivide, A, permute(Esun, [1 3 2])); 

Die Variable A ist die 3D-Matrix, die Sie haben, dass der Größe ist 256 x 3527 x 8. Der Aufruf an permute verwendet Esun und konvertiert es in einen 3D-Vektor von 1 Zeile und 1 Spalte. Danach sendet bsxfun den 3D-Vektor, so dass er zu einer 3D-Matrix der Größe 256 x 3527 x 8 wird, wobei jeder Abschnitt i den iten Wert in Esun darstellt. Wir führen dann die elementweise Aufteilung durch.

Dies führt im Grunde die repetitive Array-Operation, von der Sie sprechen, aber die Replikation erfolgt intern in bsxfun und ist schneller als wenn Sie das sich wiederholende Array zuerst erstellen würden, dann führen Sie die Division.

+0

Ich habe ein wenig über bsxfun gelesen und ich habe nur eine Frage: beeinflusst die Art der Grafikkarte, die ich verwende, seine Geschwindigkeit? –

+0

Nein, tut es nicht. Grafikspeicher wird nur in MATLAB verwendet, wenn 'gpuArray's verwendet werden und nur nVidia-Karten unterstützt werden. Ansonsten sollten CPU und RAM die Leistung beeinträchtigen. – rayryeng

+0

Ah okay, ich denke, ich habe die Definition falsch von der Mathworks-Seite gelesen. Danke für die Klarstellung. –

0

können Sie arrayfun wie folgt verwendet werden:

c=arrayfun(@(i) X(:,:,i)*Esun(i),1:8,'UniformOutput',0); 

Unter der Annahme, dass X Array Ihr Bild ist. In der oben kehrt MATLAB einen 1x8 Zellen-Array, dann können Sie cat Funktion nutzen das neue Array zu erhalten:

B = cat(3, c{:}); % cat all cell elements in 3-rd dim