2016-03-22 14 views
1

Haben Sie den folgenden Code sowohl in Octave 4.0.0 und MATLAB 2014 ausgeführt. Zeitunterschied ist albern, d. h. mehr als zwei Größenordnungen. Auf Windows-Laptop ausgeführt. Was kann getan werden, um die Octave-Rechengeschwindigkeit zu verbessern?Oktave ist langsam; Vorschläge

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 
while itSum < stopCrit 
    itSum = itSum + 1/iter; 
    iter = iter + 1; 
    if iter > 1e7, break, end 
end 
iter-1 
totTime = cputime - startTime 

Octave: tottime ~ 112

MATLAB: tottime < 0,4

+0

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

Antwort

1

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.

+0

Ein wenig verwirrend, weil Ihr Code Schritte der Länge "Schritt + 1" macht – Daniel

+0

@Daniel, Sie haben Recht.Der Punkt meines Codes war nur zur Veranschaulichung der Vektorisierung der Code konnte ziemlich viel beschleunigen. Neben dem Schritt = 1001, dort Es gibt auch viele Möglichkeiten, meinen Code zu verbessern, wie zum Beispiel die Schrittweite zu stimmen, die Halbierung zu verwenden, um den letzten Platz 'itSum

0

Sie können auch versuchen:

itSum = sum(1./(1:exp(stopCrit))); 
    %start the iteration 
    iter = exp(stopCrit-((stopCrit-itSum)/abs(stopCrit-itSum))*(stopCrit-itSum)); 
    itSum = sum(1./(1:iter)) 

Mit dieser Methode werden Sie nur 1 oder 2 Iteration haben. Aber natürlich summierst du jedesmal das ganze Array.