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

Neuling: Matlab Berechnungen sehr langsam, code verbessern

 

Wtler1987

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2013, 18:05     Titel: Neuling: Matlab Berechnungen sehr langsam, code verbessern
  Antworten mit Zitat      
Hallo zusammen,

ich benutze seit kurzer Zeit Matlab für ein Projekt und arbeite dabei mit einem vorgefertigten Skript eines Kollegen (der mitlerweile nicht mehr bei uns ist). Leider kenne ich mich mit Matlab noch nicht allzu gut aus. Wenn ich meine Daten (z.B. 25000 Werte) in das Skript lade und ausführe macht der Rechner nichts mehr, hängt sich auf oder bringt bei noch mehr Werten einen "Out of Memory". Habe einen Dualcore mit 8GB Arbeitsspeicher, denke das sollte nicht das Problem sein bei 50.000 Datenpunkten oder weniger?!

Nun dachte ich mir eventuell der Code nicht sehr gut programmiert wurde und hoffe sehr dass ihr mir irgendwie helfen könnt.

Ich sage schonmal vielen vielen Dank!!!!!

Hier einmal der Code für euch:

Code:

function [t,f,s,g_all,ffit_all,g,ffit,lambda,c] = InvLap(t,f,Tmin,Tmax,Tn,method,iter,dim,varargin)

% [s,g,ffit] = InvLap(x,y,Tmin,Tmax,Tn,'method',iter,dim,OPTIONS)
%
% examples: InvLap(t,y,0.1,10000,100,'Press',100,'full');
%           v
% Input variables:
%    x:        vector array:    time
%    y:        vector array:    amplitude  
%    Tmin:     scalar:          lowest time constant in ms
%    Tmax:     scalar:          highest time constant in ms
%    Tn:       scalar:          number of time constants
%    method    string/scalar:   'SDCS' (1)(ref 1) or 'BRD' (2) (ref 4) 'SIMPLEX'  
%    iter:     scalar:          amount of iterations
%    dim:      string/scalar:   dimension of data vectors: 'full' or scalar
%
% OPTIONS    
%
%   lambda:   string/scalar:        regularization parameter
%        scalar
%       'trace': weight of data and regularisation is comparable  (ref 1)
%       'lcur':  lambda is determined by L-curve method (ref 2)
%       'auto':  lambda is determined by S-curve method (ref 3)
%           'lambda_min': scalar
%           'lambda_max': scalar
%           'lambda_n':   scalar
%
%   plotmode:  scalar
%       0:      no plots  (default)
%       1:      intermediat plots
%
%   TOL: scalar:  (0<TOL<1) Tolerance parameter to determine lambda. Default = 0.005) (ref 3)
%
% Output variables
%   s:       vector array:   time constants
%   g:       vector array:   weigth factors of time constants
%   ffit:    vector array:   resulting decay
%
%
% Example:
%
% References:
% 1: W. H. Press, S. A. Teukolsky, W. T. Vetterling & B. P. Flannery (2002). Numerical Recipes
%    in C - The Art of Scientific Computing. Cambridge University Press, Cambridge, second
%    edition edition.
%
% 2: P. C. Hansen (1994). Regularization tools: A matlab package for analysis and solution
%    of discrete ill-posed problems. Numerical Algorithms, 6(1):1 – 35.
%
% 3: E. Fordham, S. A. & L. Hall (1995). Imaging multiexponential relaxation
%    in the (y, loget1) plane, with application to clay filtration in rock
%    cores. Journal of Magnetic Resonance, Series A, 113(2):139 – 150.
%
% 4: L. Venkataramanan, Y.-Q. Song & M. D. Hurlimann (2002). Solving fredhol integrals of the
%    firts kind with tensor product structure in 2 and 2.5 dimensions. IEEE Transactions on
%    signal processing, 50(5):1017 – 1026.

%%  set output grid s
s = logspace(log10(Tmin),log10(Tmax),Tn);

%% reducing dimensions if wanted

if strcmp(dim,'full')==1
    dim=length(t);
else
    if dim>length(t)
    error('info:dim','Dimension exceeds length data');
    end
    t=reddim(t,dim);
    f=reddim(f,dim);
end
 
%%  calculate K(t,s)=exp(-t/s): matrix a
t=t(:);
s=s(:)';
A=exp(-t*(1./s));

%% calculate reg matrix H
m=length(s);
B=eye(m); %zeroth order regularisation
H=B'*B;

%% Default values for options
c=1;
plotmode=0;
TOL=0.005;
lambda=trace(A'*A)/trace(H);
lambda_min=-3;
lambda_max=6;
lambda_n=10;

   
%% checking options
if nargin>8
for i=1:2:nargin-8
    pname = varargin{i};
    pval =  varargin{i+1};
    switch lower(pname)
        case('lambda')
            if ischar(pval)==0;
                lambda=pval;
            else          
                switch pval
                    case('trace')
                        lambda=trace(A'*A)/trace(H)
                    case('lcur')
                        [U1,s1,V1]=csvd(A);
                        [reg_corner,rho,eta,reg_param] = l_curve(U1,s1,f,'Tikh',B,V1);
                        lambda=reg_corner;
                    case('auto')
                        lambda=logspace(lambda_min,lambda_max,lambda_n);
                    otherwise
                        lambda;
                end
            end
             
        case('plotmode')
            switch pval
                case('on')
                    plotmode=1;
                case('off')
                    plotmode=0;
                otherwise
                    error('info:UnknownParameterName',...
                'Unknown plotmode: %s.',pname);
            end
       
        case('tol')
            TOL=pval;
           
        case('lambda_min')
            lambda_min=pval;
            lambda=logspace(lambda_min,lambda_max,lambda_n);
        case('lambda_max')
            lambda_max=pval;
            lambda=logspace(lambda_min,lambda_max,lambda_n);
        case('lambda_n')
            lambda_n=pval;
            lambda=logspace(lambda_min,lambda_max,lambda_n);
       
        otherwise
            error('info:UnknownParameterName',...
                'Unknown option: %s.',pname);
    end
end
end


chi=zeros(1,length(lambda));
g_all=zeros(length(s),length(lambda));
ffit_all=zeros(length(t),length(lambda));

for j=1:length(lambda)
    lambda_j=lambda(j);

switch method
    case('SDCS')    
        a=A'*A+lambda_j*H;
        y=A'*f;
        [L,U]=lu(a);
        g=U\(L\y);
        e=2/max(eig(a));

        a=A'*A;  %no regularisation now

        h=waitbar(0,['Calculation distribution with \alpha = ',num2str(lambda_j)]);
        if plotmode==1
            h2=figure;
        end

        for i=1:iter;
        waitbar((i+iter*(j-1))/(iter*length(lambda)));  
   
            g=(g>0).*g;   %map neg to zero
            g(1)=0;
            g(end)=0;
            g=(eye(m)-e*a)*g+e*y;   % Eq. 18.5.21   (b=0)
   
            if plotmode==1 && rem(i,iter/50)==0  %plotting
               title_string=['Alpha = ',num2str(lambda_j)];
               InvLap_plot(h2,title_string,s,g,t,f,A);
            end
        end
        close(h)
        g=(g>0).*g;    %map neg to zero again
        g(1)=0;
        g(end)=0;
        ffit=A*g;      
       
       
        case('Simplex')    
        g0=lognpdf(s,log(100),0.2);
        g0=g0(:);
        [g,~,ffit,eltime] = simplex(t,f,g0,s,lambda_j,1,iter,'test',@semilogx,'decay');
           
            if plotmode==1 && rem(i,iter/50)==0  %plotting
                   title_string=['Alpha = ',num2str(lambda_j)];
                   InvLap_plot(h2,title_string,s,g,t,f,A);
            end

           
    case('BRD')
        g0=lognpdf(s,log(100),0.2);
        g0=g0(:);
        c=(A*g0-f)/-lambda_j;
        h=waitbar(0,['calculation distribution with \alpha = ',num2str(lambda_j)]);

        if plotmode==1
           h2=figure;
        end

        for i=1:iter
            waitbar((i+iter*(j-1))/(iter*length(lambda)));  
            G=A*  diag((A'*c>0))  *A';
            Dchi=(G     +   lambda_j*eye(length(f)))*c-f;
            DDchi=G     +   lambda_j*eye(length(f));
            c=c-(DDchi)\Dchi;
            g=A'*c;
            g=(g>0).*g;
            ffit=A*g;
            if plotmode==1 %plotting
               title_string=['Alpha = ',num2str(lambda_j)];
               InvLap_plot(h2,title_string,s,g,t,f,A);
            end
        end
        close(h)
end
g_all(:,j)=g;
ffit_all(:,j)=ffit;
chi(j)=sum((A*g-f).^2)./dim;
end
s=s';

if j>1
figure
loglog(lambda,chi,'bx-')

[r c]=find((TOL-diff(log10(chi))./diff(log(lambda))).^2==min((TOL-diff(log10(chi))./diff(log(lambda))).^2));
lambda_j=lambda(c(end));
hold on
loglog(lambda_j,chi(c(end)),'o','Markerfacecolor','b');
xlabel('\alpha')
ylabel('\chi^2')
g=g_all(:,c);
ffit=ffit_all(:,c);
end

if j>1 || plotmode==0
h3=figure;
title_string=['Alpha = ',num2str(lambda_j)];
InvLap_plot(h3,title_string,s,g,t,f,A);
end

end

%% plotting function
function InvLap_plot(h,title_string,s,g,t,f,A)
h;
subplot(3,1,1)
semilogx(s,g,'xr','LineWidth',2)
title(title_string);
ylabel('Amplitude');xlabel('T_2 (ms)')
hold off

subplot(3,1,2)
plot(t,f,'.');hold on;plot(t,A*g,'r')
ylabel('Amplitude');xlabel('t (ms)')
hold off
           
subplot(3,1,3)
plot(t,f-A*g,'k');hold on; line([0 max(t)],[0 0],'color','k')
ylabel('Residues');xlabel('t (ms)')
hold off    
       
drawnow
end

%% reducing dimensions
function Ar=reddim(A,l)
[r c]=size(A);

% reducing length must be dimension rows
if r<c
    A=A';
end
%reducing factor
rf=round(size(A,1)./l);
%new size A
Ar=zeros(round(size(A,1)/rf-1),size(A,2));
%reducing
for i1=1:round(size(A,1)/rf-1)
    for i2=1:rf
        Ar(i1,:)=Ar(i1,:)+A((i1-1)*rf+i2,:);
    end
end
Ar=Ar./rf;
if r<c
    Ar=Ar';
end
end
 


Wtler1987

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2013, 18:25     Titel: Nachtrag
  Antworten mit Zitat      
Ich habe noch einen nachtrag, laut dem Profiler ist Line 217 der Abschnitt der am am allerlängsten dauert, es sieht ganz stark aus als wäre das der "Übeltäter".
 
Wtler1987

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2013, 18:26     Titel: Nachtrag 2
  Antworten mit Zitat      
Sorry, herje bin ich verpeilt.

Line 217 ist der Befehl: c=c-(DDchi)\Dchi;
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.09.2013, 18:47     Titel:
  Antworten mit Zitat      
Code:
for i=1:iter
            waitbar((i+iter*(j-1))/(iter*length(lambda)));  
            G=A*  diag((A'*c>0))  *A';
            Dchi=(G     +   lambda_j*eye(length(f)))*c-f;
            DDchi=G     +   lambda_j*eye(length(f));
            c=c-(DDchi)\Dchi;
            g=A'*c;
            g=(g>0).*g;
            ffit=A*g;
            if plotmode==1 %plotting
               title_string=['Alpha = ',num2str(lambda_j)];
               InvLap_plot(h2,title_string,s,g,t,f,A);
            end
        end

da kommt i nur in der waitbar vor sonst nirgends oder? das heist die forschleife ist sinnlos und frisst nur zeit da berechnungen nur unnötig oft durchgeführt werden.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Wtler1987

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2013, 21:20     Titel:
  Antworten mit Zitat      
Ja, soweit ich das sehe kommt das nur einmal vor. Kann ich da was an der Struktur verändern dass er das schneller/ effizienter durchführt mit der Berechnung für diesen Befehl. Ich hab defacto das problem dass ich bei der menge an datenpunkten einfach einen aufhänger habe oder er es schlichtweg nicht auf die Reihe bekommt ein ergebnis auszuspucken.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2013, 23:01     Titel: Schleife ist nicht sinnlos
  Antworten mit Zitat      
also die Schleife ist nicht sinnlos, da es sich um einen iterativen Prozess dreht. Die Variable c wird innerhalb der Schleife iterativ berechnet.

Ich schätze das ein Teil des Problems ist mehr der plot-Befehl innerhalb der Schleife, dadurch wird das ganze x-mal geplottet, wobei x halt die Anzahl der Iterationen ist.

Was die allgemeine Optimierung angeht, nach kurzem drüber schauen würde ich sagen, da kann man eine ganze Menge Schleifen durch Vektoroperationen optimieren, habe allerdings gerade kein Matlab da, um das auszuprobieren.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 06.09.2013, 23:13     Titel:
  Antworten mit Zitat      
Zitat:
also die Schleife ist nicht sinnlos, da es sich um einen iterativen Prozess dreht. Die Variable c wird innerhalb der Schleife iterativ berechnet.
stimmt
hab ich übersehen Smile
_________________

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: 06.09.2013, 23:30     Titel:
  Antworten mit Zitat      
Hallo,

stelle bitte einen funktionierenden Beispielaufruf zur Verfügung. Die Daten können auch Zufallszahlen sein, solange es damit funktioniert.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2013, 10:16     Titel:
  Antworten mit Zitat      
Was meinst du mit Beispielaufruf?!!
 
Wtler1987

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2013, 10:20     Titel:
  Antworten mit Zitat      
Aso, ich verstehe..
Also zum starten braucht ihr folgenden code und die beispiel.dps datei:

Code:
%
profile on;
A=load([cd,'\beispiel.dps']);

t=A(1:14999,2);
y=A(1:14999,3); %y=A(2:6:24000,2)
offset=mean(y(end-100:end)); %für T2: offset=mean(y(end-100:end))
y=y-offset;
%[s,g,ffit]=InvLap(t,y,0.01,1000,100,'BRD',10,'lambda',logspace(-3,2,5),'plotmode','off');
[t,f,s,g_all,ffit_all,g,ffit,lambda,c]= InvLap2(t,y,2,20000,200,'BRD',1,'full','lambda',0.1,'plotmode','off'); %erweiterte Berechnung mit InvLap2
%[t,f,s,g_all,ffit_all,g,ffit,lambda,c]= InvLap2(t,y,0.1,1000,200,'PRESS',1000,'full','lambda','auto','lambda_min',-1,'lambda_max',-1,'lambda_n',1,'plotmode','off'); %[s,g,ffit]=InvLap2(t,y,0.1,1000,100,'BRD',10,'auto'); %erweiterte Berechnung mit InvLap2
%disp('Example 2')
%InvLap(t,y,0.1,1000,200,'Press',5000,'lambda',logspace(-3,0,10),'plotmode','off');
profile off; profile viewer;
 
 
Harald
Forum-Meister

Forum-Meister


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

du hast eine Funktion gepostet, die (mindestens) 8 Argumente erwartet.

Ich habe mal versucht, die Funktion mit Zufallszahlen aufzurufen und mich dabei an dem "examples"-Kommentar orientiert, aber eine Fehlermeldung bekommen:
Zitat:
At compilation, "g" was determined to be a variable and this
variable is uninitialized. "g" is also a function name and previous versions
of MATLAB would have called the function.
However, MATLAB 7 forbids the use of the same name in the same
context as both a function and a variable.

Error in InvLap (line 228)
g_all(:,j)=g;


Um mir genauer anzusehen, warum die Funktion langsam ist und was man daran machen kann, würde ich die Funktion gerne mal ausführen. Ich weiß allerdings nicht wie. Daher die Bitte um einen Beispielaufruf - also ein Beispiel, wie man die Funktion aufruft.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2013, 10:23     Titel:
  Antworten mit Zitat      
Sorry dass ich so viele Posts mache, hier die datei noch..Könnt sie einfach in beispiel.dps umbenennen oder im vode die endung .txt benutzen. Sollte beides funktionieren. Vielen Dank für eure Hilfe

beispiel.txt
 Beschreibung:

Download
 Dateiname:  beispiel.txt
 Dateigröße:  434.71 KB
 Heruntergeladen:  284 mal
 
Harald
Forum-Meister

Forum-Meister


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

funktioniert leider nicht. Beim ersten Aufruf von InvLap kommt die Fehlermeldung:
Zitat:
Error using /
Matrix dimensions must agree.

Error in InvLap>reddim (line 289)
Ar=zeros(round(size(A,1)/rf-1),size(A,2));

Error in InvLap (line 69)
t=reddim(t,dim);


Was ist InvLap2?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2013, 11:32     Titel:
  Antworten mit Zitat      
Das ist quasi der erste Code den ich oben geschrieben habe. Schicke es nochmal als Anhang mit. Habe nochmal versucht mit 50.000 Werten, bricht er nach einer halben Std standbild ab mit fehler "out of memory".

Ich verstehe gar nicht was da das Problem ist, offensichtlich ging das Skript ja mit der Programmierung bei der Menge an Datenpunkten da vorher schon Werte damit ausgewertet wurden. Und da waren die Rechner noch deutlich schlechter bestückt (denke das Skript ist von 2010 rum).

InvLap2.m
 Beschreibung:

Download
 Dateiname:  InvLap2.m
 Dateigröße:  8.25 KB
 Heruntergeladen:  202 mal
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 07.09.2013, 11:35     Titel:
  Antworten mit Zitat      
lief er vorher auf einer 64 bit version und du benutzt nun eine 32 bit version ?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.