Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Chemische Reaktionstechnik mit MATLAB und Simulink

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Rechenintensive for-Schleife / alternativer Code?

 

LloydBlankfein
Forum-Anfänger

Forum-Anfänger



Beiträge: 13
Anmeldedatum: 18.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2020, 17:21     Titel: Rechenintensive for-Schleife / alternativer Code?
  Antworten mit Zitat      
Hallo,

folgende for-Schleife wird tausendfach aufgerufen und kostet mehre Stunden Rechenzeit:

Code:

for i=3:size(TT,1)
   
    TT.ModelNAV(i) = TT.ModelNAV(i-1) + (TT.FutureContract(i-2) + TT.ModelContract(i-2)) * (TT.FuturePX(i) - TT.FuturePX_LAST(i-1)) + (TT.FutureContract(i-1) + TT.ModelContract(i-1)) * (TT.FuturePX_LAST(i) - TT.FuturePX(i));  
    if TT.Signal(i) == TT.Signal(i-1)
        TT.FutureContract(i) = TT.FutureContract(i-1);
        TT.ModelContract(i) = TT.ModelContract(i-1);
    else
        TT.FutureContract(i) = TT.ModelNAV(i)/TT.FuturePX(i);
        TT.ModelContract(i) = TT.ModelNAV(i) / TT.FuturePX(i) / TT.Duration(i-1) * TT.Signal(i-1);
    end

    if TT.LONGSignal(i) == 1
        TT.LONGNAV(i)  = TT.LONGNAV(i-1)  + (TT.FutureContract(i-2) + TT.LONGContract(i-2))  * (TT.FuturePX(i) - TT.FuturePX_LAST(i-1)) + (TT.FutureContract(i-1) + TT.LONGContract(i-1))  * (TT.FuturePX_LAST(i) - TT.FuturePX(i));
    else
        TT.LONGNAV(i)  = TT.LONGNAV(i-1);
    end
    if TT.LONGSignal(i)  == TT.LONGSignal(i-1) || TT.LONGSignal(i) ~= 1
        TT.LONGContract(i)  = TT.LONGContract(i-1);  
    else        
        TT.LONGContract(i)  = TT.LONGNAV(i)  / TT.FuturePX(i) / TT.Duration(i-1) * TT.Signal(i-1);
    end
   
    if TT.SHORTSignal(i) == -1
        TT.SHORTNAV(i) = TT.SHORTNAV(i-1) + (TT.FutureContract(i-2) + TT.SHORTContract(i-2)) * (TT.FuturePX(i) - TT.FuturePX_LAST(i-1)) + (TT.FutureContract(i-1) + TT.SHORTContract(i-1)) * (TT.FuturePX_LAST(i) - TT.FuturePX(i));
    else
        TT.SHORTNAV(i) = TT.SHORTNAV(i-1);
    end
    if TT.SHORTSignal(i) == TT.SHORTSignal(i-1) || TT.SHORTSignal(i) ~= -1
        TT.SHORTContract(i) = TT.SHORTContract(i-1);
    else
        TT.SHORTContract(i) = TT.SHORTNAV(i) / TT.FuturePX(i) / TT.Duration(i-1) * TT.Signal(i-1);
    end
   
end
 


Da die Variablen teilweise selbstbeschreibend sind, kommt eine Vektorisierung nicht in Frage. Hat eventuell jemand eine Idee wie ich die Rechenzeit trotzdem verkürzen kann?

Llyod
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 22.650
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.12.2020, 17:39     Titel:
  Antworten mit Zitat      
Hallo,

was ist TT denn überhaupt? Ein Timetable? Ein Struct? Ein Objekt?
Sind die Variablen / Felder / Eigenschaften vorbelegt?

Es kann helfen, mit Vektoren statt den genannten zu arbeiten, um die Zugriffszeiten zu minimieren, also z.B. ModelNAV statt TT.ModelNAV.
Ansonsten sehe ich nur die Möglichkeit der Generierung einer MEX-Datei (mit MATLAB Coder).

Ein reproduzierbares Beispiel macht das ganze (wie immer Wink ) einfacher, denn dann kann ich mir die Nachfragen schenken und meine Vorschläge auch gleich testen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
LloydBlankfein
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 13
Anmeldedatum: 18.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2020, 18:18     Titel:
  Antworten mit Zitat      
Hallo Harald,

TT ist ein Timetable, die Werte sind vorbelegt. Das Thema Zugriffszeiten hatte ich nicht auf dem Radar, danke für den Hinweis.

Anbei der vollständige Code sowie das m-File welches der Funktion übergeben werden muss.

Lloyd

TT.mat
 Beschreibung:

Download
 Dateiname:  TT.mat
 Dateigröße:  160.03 KB
 Heruntergeladen:  13 mal
NAV.m
 Beschreibung:

Download
 Dateiname:  NAV.m
 Dateigröße:  3.78 KB
 Heruntergeladen:  14 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich hab's mal ausprobiert, und durch Vermeiden der wiederholten Indizierung ist man sehr viel schneller.

Übrigens kannst du einen Timetable auch erweitern mit TT.NewVar = NewData. Das sollte einfacher sein als deine Code-Blöcke mit array2timetable.

Grüße,
Harald

NAV2.m
 Beschreibung:

Download
 Dateiname:  NAV2.m
 Dateigröße:  4.32 KB
 Heruntergeladen:  15 mal

_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
LloydBlankfein
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 13
Anmeldedatum: 18.06.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2020, 16:29     Titel:
  Antworten mit Zitat      
Vielen Dank Harald! Ich werde meinen Code bzgl. der Indizierungen anpassen.
Der Hinweis "TT.NewVar = NewData" ist ebenfalls nützlich, danke auch hierfür!
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.