Hallo,
wie das Thema schon sagt habe ich ein kleines Problemchen. Weiß jemand wie man anstatt mit for-Schleifen mit Matrizen rechnet. Ich möchte ein Beispiel sehen. Mein Code ist zu langsam (also braucht ca. 4 Tage) da ich drei for-schleifen habe. Es ist mir klar, dass ich insgesamt 500.000.000 Durchläufe habe. Aber das hätte trotzdem in Java viel schneller funktioniert. Weiß jemand wie ich den Code optimieren könnte. Sollte irgendwie mit Matrizen schneller gehen.
Vielen Dank im Voraus.
Die Frage ist inwiefern da was interativ berechnet wird oder nicht.
Andreas[/code]
studentTU
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 05.07.2011, 21:22
Titel:
erstmal vielen Dank.
Jetzt bin ich weiter gekommen. Zuerst musste ich die äußerste Schleife löschen (mit numberOfCredits). Nun habe ich den folgenden Code (ich habe zeilenweise aus den Schleifen rausgenommen)
Code:
PD=0.01; % 0.001 0.01 0.2 0.025 0.05 0.1
T=50; % 5 7 10 20 50
n=10; % 100000
rho=0.12*((1-exp(-50*PD))/(1-exp(-50)))+0.24*(1-(1-exp(-50*PD))/(1-exp(-50)));
b=(0.11852-0.05478*log(PD))*(0.11852-0.05478*log(PD));
F2=(1+(T-2.5)*b)/(1-1.5*b);
F=randn(n,T);
% ab hier wurden die Zeilen aus der Schleife extrahiert
lambda = normcdf((norminv(PD,0,1)-sqrt(rho)*F(:,:))/sqrt(1-rho));
erg=(lambda(:,:)-PD)*F2;
B=mean(lambda(1:n,:),2); % Mittelwert über 2.Dim
rho_new=0.12*((1-exp(-50*B(:)))/(1-exp(-50)))+0.24*(1-(1-exp(-50*B(:)))/(1-exp(-50)));
% hier beginnt das Problem
lambda_new=normcdf((norminv(B,0,1)-sqrt(rho_new)*F)/sqrt(1-rho_new));
for k=1:n
if(mod(k,1000)==0) disp(k) end for i=1:T
%lambda(k,i, numberOfCredits)=normcdf((norminv(PD,0,1)-sqrt(rho)*F(k,i))/sqrt(1-rho));
%erg(k)=(lambda(k,i)-PD)*F2; % True Kapitalpuffer
%B(k)=mean(lambda(k,:),2); % Mittelwert über 2.Dim
%rho_new(k)=0.12*((1-exp(-50*B(k)))/(1-exp(-50)))+0.24*(1-(1-exp(-50*B(k)))/(1-exp(-50)));
%lambda_new(k,i)=normcdf((norminv(B(k),0,1)-sqrt(rho_new(k))*F(k,i))/sqrt(1-rho_new(k)));
b_new(k)=(0.11852-0.05478*log(B(k)))*(0.11852-0.05478*log(B(k)));
F2_new(k)=(1+(T-2.5)*b_new(k))/(1-1.5*b_new(k));
erg_new(k,i)=(lambda_new(k,i)-B(k))*F2_new(k); % Simulated Kapitalpuffer end end
warum berechnest du das i mal? reicht doch wenn du es für k einmal berechnest...
ein weiteres perfomance nogo ist das erg_new und co in der for schleife größer werden
also wenn du schon statt matrixenbefehlen schleifen nutzt genau prüfen was wann berechnet werden muss und matrixen und vektoren bitte vorher allokieren
studentTU
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.07.2011, 13:33
Titel:
und noch mal vielen Dank sieht schon deutlich besser aus.
so sieht das ohne schleifen aus inweit das schneller ist weiß ich nicht die repmat sind sicher nicht so optimal aber sonst weiß ich nicht wie ich einen vektor anders elementweise mit einer Matrix multiplizieren sollte
geht leider nicht
ich bekomme folgenden fehler
??? Error using ==> erfc
Input must be real and full.
Error in ==> normcdf at 94
p(todo) = 0.5 * erfc(-z ./ sqrt(2));
Error in ==> perftest at 31
lambda_mat_new=normcdf(bsxfun(@minus,norminv(B,0,1),sqrt(bsxfun(@rdivide,bsxfun(@times,rho_new,F),sqrt(1-rho_new)))));
ohne das normcdf geht es noch und scheint auch minimal schneller zusein...
Ich bin von den unterschiedlichen Code-Blöcken in diesem Thread verwirrt. Kannst Du die aktuelle effizienteste Methode nochmal zusammenfassen und posten?
Man kann noch einiges verbessern: "clear all" raubt eine Menge Zeit, weil es alle bereits in den Speicher geladenen Funktionen wieder löscht. Ich habe bis heute noch kein Programm gesehen, in dem "clear all" irgendwie nützlich war.
Die LOG Funktion ist teuer, also wendet man "log(B)" am besten nur einmal an. SUM(X)/size(X,1) ist schneller als MEAN.
Die Ursache für diesen Fehler verstehe ich nicht:
??? Error using ==> erfc
Input must be real and full.
Vielleicht wird das im zusammengefassten Code klar.
ähm das mit den logsachen habe ich noch nicht geändert, die clear all und clc sind nur drin damit ich sicher sein kann das es nicht nur läuft weil noch was gelanden war das kann später noch raus
Einstellungen und Berechtigungen
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
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.