Ich habe einen MATLAB-Code geschrieben, um ein seismisches Signal (zB P-Welle) aus einer SAC-Datei (Seismik) zu finden (die über einen anderen Code gelesen wird). Dieser Algorithmus heißt STA/LTA Trigger-Algorithmus (eigentlich nicht so wichtig für meine Frage)Ich möchte Ratschläge zur Optimierung meines Codes erhalten. Es dauert zu lange für die Ausführung
Wichtig ist, dass eigentlich dieser Code gut funktioniert, aber da meine seismische Datei zu groß ist (1GB, was für zwei Monate ist), Es dauert fast 40 Minuten für die Ausführung, um das Ergebnis zu sehen. Daher habe ich das Bedürfnis, den Code zu optimieren.
Ich hörte, dass das Ersetzen von Schleifen mit erweiterten Funktionen helfen würde, aber da ich ein Neuling in MATLAB bin, kann ich keine Ahnung davon bekommen, wie es zu tun ist, da der Zweck von Code durch die jede Zeitreihe gescannt wird. Ich habe auch gehört, dass die Vorallokation helfen könnte, aber ich habe nur eine Idee, wie man das macht.
Da es sich bei diesem Code um Seismologie handelt, ist es vielleicht schwer zu verstehen, aber meine Notizen oben könnten helfen. Ich hoffe, ich kann hier einen nützlichen Rat bekommen. Folgendes ist mein Code.
function[pstime]=classic_LR(tseries,ltw,stw,thresh,dt)
% This is the code for "Classic LR" algorithm
% 'ns' is the number of measurement in STW-used to calculate STA
% 'nl' is the number of measurement in LTW-used to calculate LTA
% 'dt' is the time gap between measurements i.e. 0.008s for HHZ and 0.02s for BHZ
% 'ltw' and 'stw' are long and short time windows respectively
% 'lta' and 'sta' are long and short time windows average respectively
% 'sra' is the ratio between 'sta' and 'lta' which will be each component
% for a vector containing the ratio for each measurement point 'i'
% Index 'i' denotes each measurement point and this will be converted to actual time
nl=fix(ltw/dt);
ns=fix(stw/dt);
nt=length(tseries);
aseries=abs(detrend(tseries));
sra=zeros(1,nt);
for i=1:nt-ns
if i>nl
lta=mean(aseries(i-nl:i));
sta=mean(aseries(i:i+ns));
sra(i)=sta/lta;
else
sra(i)=0;
end
end
[k]=find(sra>thresh);
if ~isempty(k)
pstime=k*dt;
else
pstime=0;
end
return;
Sind Sie sicher, dass Ihnen nicht mehr genügend Arbeitsspeicher zur Verfügung steht? Weil es mir scheint, dass einige kleinere Optimierungen keinen großen Unterschied machen. –