2013-10-15 5 views
5

Ich habe eine 3D-Matrix eines Films (sagen wir eine Matrix M der Größe J * K * L). Ich möchte jeden Rahmen nach links rechts drehen. Die Verwendung von fliplr(M) funktioniert nicht, da M eine 2-D-Matrix sein muss. Ich weiß, ich kann eine for-Schleife der folgenden verwenden:Vektorisierung von Links-Rechts-Flip einer 3D-Matrix mit Matlab

for ii=1:size(M,3) 
    M(:,:,ii)=fliplr(M(:,:,ii)) 
end 

Ist die eine "vektorisierte" Möglichkeit, es zu tun?

Allgemeiner gesagt, ist die "vektorisierte" Möglichkeit, irgendeine von Matlabs Matrixmanipulationen (flipud, repmat, usw.) in diesem Fall zu tun?

Antwort

4

Alternativ können Sie auch einfach die Indizierung verwenden:

>> M = rand(3,4,5); 
>> M(:, end:-1:1, :); 

Dieses viel schneller ist und weniger ressourcenintensiv als flipdim, und ich denke auch viel sauberer.

Doch für manche Menschen diese besondere Nutzung des end Schlüsselwort ist verwirrend, wenn Sie also eine jener Leute sind, flipdim ganz gut tun :)

+0

Danke, das macht voll und ich mag es noch besser! Je weniger spezielle Matlab-Funktionen ich brauche, desto besser. –

+0

Es ist eine vollkommen gültige Alternative - persönlich bevorzuge ich 'flipdim', weil es mir genau sagt, was es macht. Wenn ich den obigen Code sehe, muss ich nachdenken ... Dieser ist vielleicht einfacher zu schreiben (muss sich nicht an einen Funktionsnamen erinnern), der andere ist leichter zu lesen. Das Coole an SO ist, dass Sie beide Antworten bekommen, und Sie können wählen. – Floris

4

Ich glaube, Sie suchen

M = flipdim(M, 2); 

Diese Flips eine N-dimensionale Matrix entlang der Dimension, die Sie als zweiten Parameter angeben. Somit kann die flipud konnte mit

ersetzt
M = flipdim(M, 1); 

nicht sicher, wo Sie mit der repmat Frage gehen, aber ich finde oft kann ich bsxfun statt repmat verwenden. Schlag es nach.

+1

Ah, Sie es um 9 Sekunden bekam. +1 für dich, nicht dass du es brauchst. ;) – chappjc