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.
% [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.
ifstrcmp(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;
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;
%% 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([0max(t)],[00],'color','k') ylabel('Residues');xlabel('t (ms)') hold off
%% 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
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".
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.
_________________
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: ---
Verfasst am: 06.09.2013, 23:01
Titel: Schleife ist nicht sinnlos
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.
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
Wtler1987
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.09.2013, 10:23
Titel:
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
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
Wtler1987
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.09.2013, 11:32
Titel:
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).
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.