Es braucht eine Menge von Iterationen in der Schleife die Ergebnisse in Ihrem Code zu berechnen. Vectoring der Code wird dazu beitragen, viel zu beschleunigen. Mein folgender Code macht genau das, was Sie getan haben, aber vektorisieren Sie die Berechnung ziemlich ein bisschen. Sehen Sie, ob es hilft.
startTime = cputime;
iter = 1; % iter is the current iteration of the loop
itSum = 0; % itSum is the sum of the iterations
stopCrit = sqrt(275); % stopCrit is the stopping criteria for the while loop
step=1000;
while(itSum < stopCrit && iter <= 1e7)
itSum=itSum+sum(1./(iter:iter+step));
iter = iter + step+ 1;
end
iter=iter-step-1;
itSum=sum(1./(1:iter));
for i=(iter+1):(iter+step)
itSum=itSum+1/i;
if(itSum+1/i>stopCrit)
iter=i-1;
break;
end
end
totTime = cputime - startTime
Meine Laufzeit beträgt nur etwa 0,6 Sekunden mit dem obigen Code. Wenn Sie nicht über genau das ist es egal, wenn die Schleife stoppt, ist der folgende Code noch schneller:
startTime = cputime;
iter = 1; % iter is the current iteration of the loop
itSum = 0; % itSum is the sum of the iterations
stopCrit = sqrt(275); % stopCrit is the stopping criteria for the while loop
step=1000;
while(itSum < stopCrit && iter <= 1e7)
itSum=itSum+sum(1./(iter:iter+step));
iter = iter + step+ 1;
end
iter=iter-step-1;
totTime = cputime - startTime
Meine Laufzeit nur etwa 0,35 Sekunden in letzterem Fall ist.
Ich weiß nicht, ob Sie bemerkt haben, dass Ihre Funktion die Summe der Obertonreihe berechnet. Also, wenn Sie viele Iterationen haben, sollten Sie besser sum (1 ./ (1: exp (stopCrit)) als Beispiel verwenden und dann die Summe bis zu dieser Summe anpassen (1 ./ (1: #iteration)) = stopCrit. – obchardon