bekanntermaßen sind For-Schleifen in Matlab ja sehr langsam, daher suche ich eine Möglichkeit meinen Code zu beschleunigen. Mein Profiling habe ich im Anhang angehängt.
der Code sieht bisher so aus... ich habe z.B. #
10 100 x 100 Matrizen
nun geh ich über zwei For schleifen die 100 x 100 Matrix durch
Geht das auch schneller? Eine Alternative zu std2 werde ich später noch ausloten, aber var scheint keine große Alternative zu sein. Mir gehts hier erstmal darum, wie man den Code matlab spezifisch optimiert.
bekanntermaßen sind For-Schleifen in Matlab ja sehr langsam, ...
Das stimmt ohne Frage für Matlab 5.3. Modernere Versionen, also seit 2000. können allerdings in vielen Fällen per JIT eine Menge aus FOR-Schleifen herausholen. Trotzdem hält sich die Meinung über träge FOR-Schleifen nachhaltig.
Das Problem in Deinem Code sind weniger die FOR-Schleifen, als das Aufrufen vieler M-Funktionen und das Heraus-Kopieren der Untermatrizen. Zunächst würde ich also "std2(X)" durch "var(X(:))" ersetzen und die Wurzel erst am Schluß ziehen - VAR ist also durchaus eine sinnvolle Alternative.
Enthält Deine Funktion übrigens die extrem wichtige Pre-allocierung von result_mat?
Code:
result_mat = zeros(100, 100, 10); % !!!! for j = 8:93 for k = 8:93
j1 = j - 7;
j2 = j + 7;
k1 = k - 7;
k2 = k + 7;
data = E5L5TR(j1:j2, k1:k2);
result_mat(j,k,1) = var(data(:));
...% etc end end
Wenn man nun die Definition von VAR betrachtet, findet man herause, dass alle Elemente der Matrizen immer wieder quadriert werden müssen. Also macht man das am besten einmal ausserhalb der Schleifen für "E5L5TR" etc, so dass die Berchnung innerhalb der Schleifen einer einfache Summe wird. Damit sollte es dann auch mit den Schleifen ordentlich schnell werden.
danke für deine Hilfe.
also result_mat ist preallokiert, ja. Von daher gibts diesbezüglich keine Probleme.
Ich kann ganz allgemein auch mit var arbeiten, das ist kein Problem.
Allerdings hatte ich:
result_mat(j,k,1) = var(reshape(E5L5TR(j-7:j+7,k-7:k+7),1,[]));
getestet und konnte keine deutliche Verbesserung feststellen.
Habe außerdem folgende Aussage gefunden:
Zitat:
Das Vermeiden von for-Schleifen ist allerdings seit Matlab 6.5 nicht mehr unbedingt n¨otig, denn hier kann der
sog. JIT-Accelerator in Aktion treten, der Schleifen (wie auch das obige Beispiel) unter bestimmten Bedingungen
automatisch kompilieren und dadurch weit schneller ausf¨uhren kann - dies gilt aber nur innerhalb von
Funktionen, nicht in Skripten oder auf der Kommandozeile. Zudem k¨onnen bei weitem nicht alle for-Schleifen
beschleunigt werden.
und ich arbeite in einem Skript. Reicht es einfach dsa Skript zu einer Funktion umzubauen und es dann nochmal zu testen?
Die Verwendung einer Funktion ist auf jeden Fall zu empfehlen!
Haben die k1,..,j2-Variablen etwas gebracht?
VAR ist STD^2. Wenn Du die einzelnen Matrizen vor den Schleifen elementweise quadrierst und statt dessen SUM verwendest, könnte das auch schneller werden.
ja gebracht hat es etwas, aber so richtig schnell ist es immer noch nicht (reine Var berechnung im Profiling 450 sekunden für ein normlaes Bild)
Das Auslagern in eine Funktion hat garnichts gebracht, ist sogar nochmla 10 Sekunden langsamer als vorher (kann auch durch andere Dinge entstehen, aber deutlich schneller ist es nicht).
Dann zeige uns doch mal die neue Version.
Wenn Du die Daten zuerst quadriert hast, kannst Du auch mit zwei CUMSUM-Befehlen einen gleitenden Mittelwert berechnen. Auch mit dem von lilov erwähnten FILTER bekommt man das effizient hin.
In einem C-Mex-Script wäre das wohl noch schneller.
Gruß, Jan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.