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

Schleifen + vierdimensionale Matrix = rechnet seit Stunden

 

Frusciante

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2009, 14:45     Titel: Schleifen + vierdimensionale Matrix = rechnet seit Stunden
  Antworten mit Zitat      
Hi, habe erst gerade mit Matlab angefangen. Das hier ist mein erster Beitrag, vielleicht kann mir jemand weiterhelfen.
Also, ich mache mit Matlab einen Gridsearch, d.h. ich suche über ein grid hinweg den kleinsten Wert. Das Grid allerdings wird mit vier Loops erstellt, weil ich die optimale Kombination aus vier Zeitpunkten t suche und zwar innerhalb eines Zeitraumes von 40 Jahren. Jede Kombination erzeugt einen Output-Wert, der ins Grid soll. Bis zur Minimierung komme ich aber gar nicht, weil Matlab seit über 12 Stunden an dem Grid bastelt.
Im Laufe der Loops wird eine vierdimensionale Matrix erstellt, so dass alle möglichen Kombinationen abgebildet werden.

Habe das ganze auch schon mit einem kleinerern Test-Datensatz versucht und alles hat optimal geklappt, d.h. mein Script ist fehlerfrei?! Beim Test hatte ich so 10-12 mögliche Realisationen (jahre) für die 4 Zeitpunkte. Das Programm hat das Grid erstellt, den kleinsten Wert gefunden und mir die optimalen vier Zeitpunkte ausgespuckt.

Meine Frage: Ist das normal, das Matlab dafür so lange braucht? Ich hab ja auch keine Ahnung, ob ich abbrechen sollte oder Matlab weiter arbeiten lassen sollte, weil ich nicht weiß, wie lange das dauern wird. Was kann ich ändern, damit das Programm schneller wird?
Code:
%Größe der Daten automatisch erfassen (m=Jahre)
[m,n] = size(data);

for ts = 1:(m-2);
    for tp1 = (ts+1):(m-1);
        for tp2 = tp1:(m-1);
            for tf = (tp2+1):m;
         
   
    phase1=data(1:ts,1);
    inf1 = mean(phase1);
   
    phase3=data(tp1:tp2,1);
    inf2 = mean(phase3);
   
    phase5=data(tf:m,1);
    inf3 = mean(phase5);    
   
    est(1:ts,1)=inf1;        
    durata=tp1-ts;
    for d1=1:durata
    est(ts+d1,1) = inf1 + (inf2-inf1)*(d1/(tp1-ts));
    end
     
    est(tp1:tp2,1)=inf2;  
   
    duratd=tf-tp2;
    for d2=1:duratd
    est(tp2+d2,1) = inf2 + (inf3-inf2)*(d2/(tf-tp2));
    end
   
    est(tf:m,1)=inf3;
       
   res1 = (data - est);
   ressum(tf,tp2,tp1,ts)= sum(res1.^2);
   ressum(ressum==0)=nan;
%ressum ist mein grid, hier arbeitet Matlab seit Stunden dran
   
            end              
        end
    end
end
   
opta=min(ressum);
optb=min(opta);
optc=min(optb);
[optd,I]=min(optc);
   
ts_opt=I
minimumres=optd
[neu,I]=min(min(min(ressum(:,:,:,ts_opt))));
tp1_opt=I
[neu2,I]=min(min(ressum(:,:,tp1_opt,ts_opt)));
tp2_opt=I
[neu3,I]=min(ressum(:,tp2_opt,tp1_opt,ts_opt));
tf_opt=I


Liegt es einfach daran, dass eine multidimensionale Matrix mit 40^4 zu groß ist? Vielen Dank schonmal für eure Vorschläge!


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.12.2009, 14:59     Titel:
  Antworten mit Zitat      
Hallo,

erster Vorschlag: das Gitter (ressum) vorbelegen.
Code:
ressum = zeros(m-2, m-1,m-1,m);


Ansonsten verstehe ich den Sinn des Codes auf den ersten Blick zu wenig, als dass ich Verbesserungen vorschlagen könnte. Halt, doch: Berechnungen, die von inneren Schleifen unabhängig sind, vorziehen, damit sie nicht wiederholt ausgeführt werden. Z.B.
Code:
phase1=data(1:ts,1);
    inf1 = mean(phase1);

ist von tp1, tp2, tf unabhängig und kann herausgezogen werden.

P.S.: Du kannst dir ja auch ein DISP-Statement oder eine Fortschrittsanzeige (waitbar) in das Programm einbauen, damit du eine Ahnung hast, wie lange es insgesamt dauern wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Frusciante

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2009, 15:24     Titel:
  Antworten mit Zitat      
Danke, Harald. Hab die entsprechenden Abstätze aus den Schleifen ausgelagert und das Grid vordefiniert. Leider kommt das Programm immer noch nicht schneller voran - sagt zumindest der Waitbar (danke dafür, kannte ich noch nicht).
Kann also weitere Anregungen gebrauchen...
 
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.