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

lange Rechenzeit

 

thomas0815
Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2010, 09:12     Titel: lange Rechenzeit
  Antworten mit Zitat      
Hallo,

nach dem mein Speicherplatzproblem gelöst scheint, habe ich ein Rechenzeitproblem durch die for-schleifen bekommen. Ich habe mein Problem mit Beispielwerten gerechnet und er rechnet jetzt seit über 14 Stunden daran. Gibt es möglichkeiten das zu beschleunigen - mein for-Schleifen durchlaufen zum Teil 10.000x500x100 arrays, das wird so seine Zeit in Anspruch nehmen. Gibt es Möglichkeiten das zu beschleunigen - eine Rechenzeit von max. 1 Stunde geht in Ordnung; aber länger darf es wohl nicht sein. Die Vektorisierung gestaltet sich schwierig, da ich die Möglichkeiten nach meinem Matlab-verständnis ausgenutzt habe (arbeite seit 3 Monaten intensiver mit Matlab)


Ein Beispiel aus meinen Programm:

Code:
for k=1:b;             % Beginne in b
    for j=2:T;              % in der Zeitstufe j
        for i=2:n;             % im Zustand i
 
                if u(i-1,j-1,k)==1;
                   
                    u(i,j,k)=x(i,j,k);
               
                elseif u(i,j-1,k)==2;
         
                    u(i,j,k)=x(i,j,k);
     
                elseif u(i+1,j-1,k)==3;
         
                    u(i,j,k)=x(i,j,k);

                else u(i,j,k)=-inf;
     
                end;
               
        end;
     % Für die erste Zeile i-1>>1
     
                if u(2,j-1,k)==3;
       
                    u(1,j,k)=x(1,j,k);
     
                elseif u(1,j-1,k)==2;
         
                    u(1,j,k)=x(1,j,k);
     
                else u(1,j,k)=-inf;
     
                end;
               
               end;
  end;

 


Für Hinweise bin ich sehr dankbar.

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen


Ralf1007
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.08.2010, 09:55     Titel:
  Antworten mit Zitat      
Hallo Thomas,

sieh Dir mal den find-Befehl an. Mit dessen Hilfe kannst du alle deine if-Abfragen ersetzen und dadurch dann auch die for-Schleifen. Noch einfacher wäre es bestimmt mit der logischen Indizierung, die ich versuche mal auf eine deiner if-Abfragen anzuwenden, wobei Dir gleichzeitig die for-Schleife erspart bleibt.

Dein Code (for-Schleifen spare ich mir):
Code:

if u(i-1,j-1,k)==1;
  u(i,j,k)=x(i,j,k);
end
 

wird ersetzt durch
Code:

idx = u == 1 % idx ist ein logisches Array, das dort 1 ist, wo u==1 und 0, wo u~=1
% nun musst du das Indexarray noch so umrechnen, dass du von i-1 und j-1 auf i und j kommst und dann machst du eine einfache Zuweisung
u(idx) = x(idx);
 

Das sollte für eine deiner if-Abfragen das tun, was du Dir wünschst. Für die Indexumrechnung könntest du es mit dem circshift-Befehl separat angewendet auf die erste und zweite Dimension deines Arrays versuchen. Vielleicht fällt Dir auch was besseres ein, musst du mal schauen. Auf analoge Weise kannst du alle deine if-Abfragen und die for-Schleifen darum ersetzen.
Das sollte jedenfalls bedeutend schneller sein.

Viele Grüße,

Ralf
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.