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

Arbeitsspeicher läuft voll

 

Pizzapapst
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 11.05.13
Wohnort: Magdeburg
Version: 2012a
     Beitrag Verfasst am: 11.05.2013, 20:03     Titel: Arbeitsspeicher läuft voll
  Antworten mit Zitat      
Liebe MatLab-Gemeinde,

erst einmal vielen Dank für die ganzen Lösungen zu Problemen, die ich bereits als Gast in diesem Forum von euch erhalten habe! Mein aktuelles Problem konnte ich jedoch trotz intensiver Suche nicht lösen, daher bitte ich euch vielmals um Hilfe (und bedanke mich im Voraus).

Ich möchte nacheinander die Nullstellen von 2484 Gleichungen ermittelt, in eine Matrix gespeichert und abschließend ausgespuckt bekommen. Leider wächst mein Arbeitsspeicher mit jeder Berechnung um etwa 2,5MB an, was die ganze Geschichte sowohl auf meinem 32-bit Win 8 als auch 64bit Win 7 unerträglich macht. Durch googlen bin ich auf Lösungsvorschläge wie preallocation (check), löschen von Variablen (check) und Verwendung vom Datentysp single statt double (check) gekommen. Es hilft mir aber alles nicht. Vorhin habe ich nach etwa 400 Berechnungen mal die Schleife gestoppt und mir alle Variablen des Workspaces speichern lassen, die Dateigröße betrug nur 188kb, der verwendete Arbeitsspeicher war jedoch auf über 1GB aufgequollen.

Hier ein lauffähiger Code:
Code:
clear
clc

syms lambda

DAX_Logrets=single(randn(2484,1));
BMW_Logrets=single(randn(2484,1));

m1=single(mean(DAX_Logrets));
m2=single(mean(BMW_Logrets));
sig1=single(std(DAX_Logrets))   ;
sig2=single(std(BMW_Logrets));

n=2484

DAXnormcdf=single(zeros(n,1));
BMWnormcdf=single(zeros(n,1));

for k=1:1:n
DAXnormcdf(k)=single(normcdf(DAX_Logrets(k),mean(DAX_Logrets),std(DAX_Logrets)));
BMWnormcdf(k)=single(normcdf(BMW_Logrets(k),mean(BMW_Logrets),std(BMW_Logrets)));
end


RESULT=single(zeros(n,1));
for k=1:1:n
k
a1=log(lambda*(1-exp(-lambda))*exp(-lambda*(DAXnormcdf(k)+BMWnormcdf(k))));
a2=log((1-exp(-lambda))-(1-exp(-lambda*DAXnormcdf(k)))*(1-exp(-lambda*BMWnormcdf(k)))).^2;
a3=(-0.5*log(2*pi)-0.5*log(sig1.^2)-0.5*((DAX_Logrets(k)-m1)/sig1).^2)+(-0.5*log(2*pi)-0.5*log(sig2.^2)-0.5*((BMW_Logrets(k)-m2)/sig2).^2);
LokLik1= a1-a2+a3;
equa=diff(LokLik1,lambda);
RESULT(k)=solve(equa,lambda,'Real',true);
clearvars a1 a2 a3 LokLik1 equa
end
RESULT


Habe ich ein Brett vorm Kopf? Wenn ja, bitte drückt es mir in's Gesicht! Wink

Vielen Dank und freundliche Grüße
Stephan
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

warum der Speicher vollläuft, kann ich dir auch nicht sagen.

Ich würde es aber von vorneherein numerisch (z.B. mit fminunc) versuchen - du willst ja das Maximum von LokLik1 finden, wenn ich das richtig verstehe?

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 11.05.13
Wohnort: Magdeburg
Version: 2012a
     Beitrag Verfasst am: 12.05.2013, 00:20     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die schnelle Antwort! Dass ich LokLik1 (besser gesagt LogLik1 Embarassed ) maximieren möchte hast du völlig richtig erkannt.

Mit fminunc (danke für den Tipp!) habe ich leider akute Probleme was meinen Laufindex k und Variablennamen angeht, nach denen ich nicht differenzieren möchte. Gebe ich bspw. ein:
Code:
function f = myfun(lambda)
f = -(log(lambda*(1-exp(-lambda))*exp(-lambda*(DAXnormcdf(1)+BMWnormcdf(1))))-log((1-exp(-lambda))-(1-exp(-lambda*DAXnormcdf(1)))*(1-exp(-lambda*BMWnormcdf(1)))).^2+(-0.5*log(2*pi)-0.5*log(sig1.^2)-0.5*((DAX_Logrets(1)-m1)/sig1).^2)+(-0.5*log(2*pi)-0.5*log(sig2.^2)-0.5*((BMW_Logrets(1)-m2)/sig2).^2));
und ersetze in meinem file die komplette Schleife durch
Code:
x0=2
[lambda,fval] = fminunc(@myfun,x0);
 
bekomme ich den Fehler Undefined function 'DAXnormcdf' for input arguments of type 'double'. Meine Daten habe ich zuvor alle wieder auf 'double', da mir fminunc vorher mitteilte, dass es nicht über 'single' minimieren möchte.

Gibt es eine Möglichkeit meine Variablen mit in die Funktion zu übertragen (und auch den Laufindex)?

Vielen Grüße,
Stephan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

siehe dazu folgenden Link:
http://www.mathworks.de/de/help/opt.....ing-extra-parameters.html

Hol dir von fminunc am besten auch das dritte Rückgabeaargument exitflag zurück und schau, ob auch wirklich ein lokales Minimum gefunden wurde (exitflag > 0).

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 11.05.13
Wohnort: Magdeburg
Version: 2012a
     Beitrag Verfasst am: 12.05.2013, 15:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich danke dir tausendfach!

Die Berechnungen laufen jetzt sehr schnell, die Ergebnisse sehen absolut plausibel aus, der Arbeitsspeicher freut sich über den entspannten Nachmittag und der Tipp mit der exitflag beantwortet die nächste Frage, vor dem ich gestanden hätte.

Vielen, vielen Dank und einen schönen Sonntag!
Stephan

PS: Sollte ich im Laufe der Zeit mal verstehen, wieso der alte Code soviel Arbeitsspeicher gefressen hat, werde ich den Thread updaten.
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.