2016-03-22 65 views
1

在Octave 4.0.0和MATLAB 2014中都運行了下面的代碼。時差是愚蠢的,即超過兩個數量級。在Windows筆記本上運行。可以做些什麼來提高八度計算速度?倍頻很慢;建議

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 

八度:totTime〜112

MATLAB:totTime < 0.4

+0

我不知道你是否注意到你的函數計算了諧波系列的總和。因此,如果您有很多迭代,最好使用sum(1 ./(1:exp(stopCrit))作爲例子,然後調整和直到該總和(1 ./(1:#iteration))= stopCrit。 – obchardon

回答

1

這需要大量的重複的循環來計算你的代碼的結果。向量化代碼將有助於加速很多。我的下面的代碼完成你所做的,但向量化了相當多的計算。看看它是否有幫助。

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 

使用上面的代碼,我的運行時間僅爲0.6秒。如果你不關心的循環停止什麼時候,下面的代碼是更快:

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 

我的運行時間僅約0.35後一種情況下第二。

+0

有點令人困惑,因爲你的代碼的步長爲'step + 1' – Daniel

+0

@Daniel,你說得對,我的代碼的目的只是爲了說明向量化代碼可以加快一點點,除了step = 1001之外,也有許多方法可以改進我的代碼,例如調整步長,使用平分在第一個循環之後找到最後一個地方'itSum

0

你還可以嘗試:

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

有了這個梅索德你只會有1或2次迭代。但是,當然,你總結每一次整個陣列。