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

Non Linear LSQ Fit - Optimierung

 

DeeKayMuc
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.09.13
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 16.09.2013, 14:23     Titel: Non Linear LSQ Fit - Optimierung
  Antworten mit Zitat      
Hallo Zusammen,

ich habe hier einen Code geschrieben, der mir den Fit berechnet zu meinem Modell. Allerdings ist der Code sehr rechenintensiv. Ich wollte Fragen, ob es möglichkeiten oder Algorithmen gibt die Performanter sind.

Ich habe die Ableitungen selber bestimmt. Dann die Wichtungen berechnet und das Ganze in einer Loop berechnet (Koeffizientenmatrix einsetzen, etc.). Der Code liefert auch das was gewünscht ist, er müsste nur schneller sein.
Code:
%function d_mono_exp_lsq_fit_perform_test(TE, TR, y, M0A, M0B, T2A, T2B, T1A, T1B, SD)
% function [M0, T2] = d_mono_exp_lsq_fit_test(t,y)
%
% Fits following function to your data: y = M0A .* f_T1A .* exp(-TE./T2A) + M0B .* f_T1B .* exp(-TE./T2B)
% Input:
% TE: echo time
% TR: repetation time
% y: signal intensity
% M0A, M0B: start value for M0
% T2A, T2B: start value for T2
% T1A, T1B: start value for T1
% SD: standard deviation of signal at respective TE (length of TE = length of SD)
%
% Output:
% M0A, M0B, T2A, T2B
%
%
% 2013 DK --> non linear LSQ

%% simuliere Messwerte
TE = [35 60 100 140 280 500 800];
y = [252.07 178.13 106.29 65.585 20.657 10.998 6.3375];
%y = M0_start*exp(-t/T2_start);
SD = [1 1 1 1 1 5 10];

% further input
TR  = 6000;  %ms
T1A = 1200; %ms
T1B = 3000; %ms

%%
%% define start value
%GMWM
M0A = 1000; %a.u.
T2A = 65;  %ms

%CSF
M0B = 100; %a.u.
T2B = 500; %ms
%%
 plot(TE,y,'*')
 hold on

%compute y
f = inline('M0A .* f_T1A .* exp(-TE./T2A) + M0B .* f_T1B .* exp(-TE./T2B)','TE','M0A','T2A','f_T1A','M0B','T2B','f_T1B');


%partial derivatives
% y = A * f_T1A * exp(-TE/T2A) + B * f_T1B * exp(-TE/T2B);
% with f_T1 = 1 - 2 * exp(-(TR-TE)/2/T1) + exp(-TR/T1);
f_T1 = inline('1 - 2 .* exp(-(TR-TE./2)./T1) + exp(-TR./T1)','TR','TE','T1');

dy_dM0 = inline('f_T1.* exp(-TE./T2)','f_T1','TE','T2');
dy_dT2 = inline('dy_dM0 .* M0 .* TE ./ T2^2','dy_dM0','M0','TE','T2');



N = length(TE);
if (N~=length(y))
    disp('dimension mismatch between TE and y_data')
end

%compute WF (vector with WF for each TE)
WF = y(1)./(y.*SD);

f_T1A = f_T1(TR,TE,T1A);
f_T1B = f_T1(TR,TE,T1B);

%plot initial guess (use starting values)
plot(TE,f(TE, M0A, T2A, f_T1A, M0B, T2B, f_T1B),'b-')
hold on;

%iteration
tic
for ii = 1:1000
    %Berechnung der Koeffizienten für die Ableitung;
    dy_dM0A_c = dy_dM0(f_T1A,TE,T2A);
    dy_dT2A_c = dy_dT2(dy_dM0A_c,M0A, TE, T2A);
    dy_dM0B_c = dy_dM0(f_T1B, TE,T2B);
    dy_dT2B_c = dy_dT2(dy_dM0B_c,M0B, TE, T2B);
       
    %Wichtung der Koeffizienten
    dy_dM0A_c_WF = dy_dM0A_c.* WF;
    dy_dT2A_c_WF = dy_dT2A_c.* WF;
    dy_dM0B_c_WF = dy_dM0B_c.* WF;
    dy_dT2B_c_WF = dy_dT2B_c.* WF;
   
    %Koeffizientenmatrix erstellen
    A = [dy_dM0A_c_WF' dy_dT2A_c_WF' dy_dM0B_c_WF' dy_dT2B_c_WF'];
    %'TE','M0A','T2A','f_T1A','M0B','T2B','f_T1B'
    delta_y_WF = (( y-f(TE, M0A, T2A, f_T1A, M0B, T2B, f_T1B)).*WF )';
   
    chi2= norm(delta_y_WF); % evtl müssen die einzelnen abstände erst noch quadriert werden
   
    %Gleichungssystem lösen
   
    %Amod=A'*A;
    %delta_ymod=A'*delta_y_WF;
    %x=inv(Amod)*delta_ymod;
    x=A\delta_y_WF;
 
    dM0A=x(1);
    dT2A=x(2);
    dM0B=x(3);
    dT2B=x(4);
   
    M0A = M0A +dM0A;
    T2A = T2A +dT2A;
    M0B = M0B +dM0B;
    T2B = T2B +dT2B;
   
    %'TE','M0A','T2A','f_T1A','M0B','T2B','f_T1B'
    y_regression = f(TE,M0A,T2A, f_T1A, M0B, T2B, f_T1B);
    plot(TE, y_regression,'r');
    title(num2str(chi2));
   
   
end

toc
%end
Private Nachricht senden Benutzer-Profile anzeigen


DeeKayMuc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.09.13
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 16.09.2013, 14:33     Titel:
  Antworten mit Zitat      
Anmerkung:

Der Code ist so wie er da steht lauffähig.

An folgender Stelle habe ich nur zwei Möglichkeiten zur Berechnung angewendet. Über die Inverse oder über \

Code:

    %Amod=A'*A;
    %delta_ymod=A'*delta_y_WF;
    %x=inv(Amod)*delta_ymod;
    x=A\delta_y_WF;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 16.09.2013, 14:42     Titel:
  Antworten mit Zitat      
ich würde mich da mal spontan an die doc halten.
Zitat:
inline will be removed in a future release.Use Anonymous Functions instead.

_________________

richtig Fragen
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: 16.09.2013, 14:43     Titel:
  Antworten mit Zitat      
Hallo,

mit dem Profiler kannst du dir ansehen, wo die Zeit verbraucht wird.
Ein Großteil der Zeit wird für das Plotten verwendet, die Frage ist also: muss der Plot wirklich in jeder Iteration aktualisiert werden?

Zudem verwendest du die antike inline-Syntax. Ich würde stattdessen anonymous function handles verwenden.

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

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 16.09.2013, 14:48     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
muss der Plot wirklich in jeder Iteration aktualisiert werden?

vorallem wird er ja sowieso nicht geplottet ohne den drawnow befehl wenn ich richtig liege
_________________

richtig Fragen

Zuletzt bearbeitet von Winkow am 16.09.2013, 14:49, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
DeeKayMuc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.09.13
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 16.09.2013, 14:49     Titel:
  Antworten mit Zitat      
ok merci, habe die inline functions ersetzt. ja plotet. nein der Plot selber muss nicht sein. Der ist nur hier ,um das Ergebnis zu sehen. Der verschwindet wieder.

Zuletzt bearbeitet von DeeKayMuc am 16.09.2013, 14:59, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 16.09.2013, 14:57     Titel:
  Antworten mit Zitat      
Zitat:
ok merci, änder ich ab. Was wäre sonst noch möglich?

der code läuft mit den vorgeschlagenen änderungen bei mir ca 130 mal schneller. also in 0.1 sec. welche performens hättest du denn gerne. ? sehr viel mehr einfache dinge fallen mir erstmal nicht ein.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.09.2013, 15:17     Titel: Re: Non Linear LSQ Fit - Optimierung
  Antworten mit Zitat      
Hallo DeeKayMuc,

Wenn das PLOT-Kommando nennenswert Zeit benötigt, wäre es effizienter, nur einmal zu plotten und danach die Handles aus dem Output des Plot-Befehls zu verwenden, um die XData und YData mit den neuen Werten zu belegen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DeeKayMuc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.09.13
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 16.09.2013, 15:27     Titel:
  Antworten mit Zitat      
Ich habe im Internet folgendes gefunden:

http://www.mathworks.de/de/products.....ization/description5.html

Wir hätten das OptimizationTool sogar da. Würde das Sinn machen, um Perfomance zu generieren?

Es gibt keine Vorgabe wie schnell es sein soll. Nur so schnell wie möglich. Da das Tool letztendlich "512x512" aufgerufen werden muss um ein ganzes Bild durch zu arbeiten. Die Iteration von 1000 ist jetzt kein Muss. Da kommt noch eine Abbruchbedingung hin. Aber selbst bei 100 Iteration benötigt er noch 0.02 sek. was sich dann aufsummiert.
Private Nachricht senden Benutzer-Profile anzeigen
 
DeeKayMuc
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 03.09.13
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 16.09.2013, 15:36     Titel:
  Antworten mit Zitat      
Ich habe auch kein Problem damit, das in C (mex files) zu programmieren und es dann in Matlab mit einzubinden, wenn das wirklich einen gewinn bringt?

Zuletzt bearbeitet von DeeKayMuc am 16.09.2013, 15:36, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 16.09.2013, 15:36     Titel:
  Antworten mit Zitat      
wenn die ergebnisse unabhängig voneinander sind würde sich mutliprozessing anbieten falls die toolbox vorhanden ist.
ob die optimization toolbox schneller ist kannst du ja mal test.
zu
Code:
giebts hir schon einige beispiele im forum.
_________________

richtig Fragen
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.