WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Code Beschleunigen [For-Schleifen, Std2]

 

Zenker
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 04.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2011, 10:21     Titel: Code Beschleunigen [For-Schleifen, Std2]
  Antworten mit Zitat      
Guten Tag,

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

Code:

    for j = 8:93
        for k = 8:93



        end
         

     
    end

 


und berechne für jeden Wert innerhalb der Matrix die Standardabweichung um 15 Werte herum:

Code:

    for j = 8:93
        for k = 8:93
            result_mat(j,k,1) = std2(E5L5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,2) = std2(S5L5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,3) = std2(W5L5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,4) = std2(R5L5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,5) = std2(S5E5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,6) = std2(W5E5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,7) = std2(R5E5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,8) = std2(W5S5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,9) = std2(R5S5TR(j-7:j+7,k-7:k+7));
            result_mat(j,k,10) = std2(R5W5TR(j-7:j+7,k-7:k+7));
        end
         

     
    end

 


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.

Danke

Profiling_Classify_Single_Pixels_Matlab_120511.pdf
 Beschreibung:

Download
 Dateiname:  Profiling_Classify_Single_Pixels_Matlab_120511.pdf
 Dateigröße:  31.46 KB
 Heruntergeladen:  742 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.05.2011, 18:29     Titel: Re: Code Beschleunigen [For-Schleifen, Std2]
  Antworten mit Zitat      
Hallo Zenker,

Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 04.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2011, 20:12     Titel:
  Antworten mit Zitat      
Servus,

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?


DANKE
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.05.2011, 13:35     Titel:
  Antworten mit Zitat      
Hallo Zenker,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 04.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2011, 12:16     Titel:
  Antworten mit Zitat      
Servus,

ja gebracht hat es etwas, aber so richtig schnell ist es immer noch nicht (reine Var berechnung im Profiling 450 sekunden Sad 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).

Was kann man noch tun?

Danke und Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 16.05.2011, 14:14     Titel:
  Antworten mit Zitat      
Hi,

ich habe bis jetzt nur gleitender Mittelwert in 2D mit windowgröße 10x10 implementieren können:

Code:

 x = rand(100,10);
 movmean = conv2(x,ones(10))/10;
 


hab eine Datei angehängt, die die gleitende Standardabweichung in 1D berechnet mithilfe der filter funktion was im prinzip ähnlich ist wie conv.

hoffe es hilft dir!

Gruß,

lilov

movingstd.m
 Beschreibung:

Download
 Dateiname:  movingstd.m
 Dateigröße:  3.81 KB
 Heruntergeladen:  356 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.05.2011, 22:08     Titel:
  Antworten mit Zitat      
Hallo Zenker,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.