2016-03-22 13 views
1

Octave 4.0.0とMATLAB 2014の両方で次のコードを実行しました。時差は愚かです。すなわち、2桁以上です。 Windowsラップトップで実行。 Octaveの計算速度を向上させるために何ができるのですか?オクターブが遅い。提案

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:#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、私のコードのポイントはコードをベクトル化することが非常に高速化できることを示すことでした。また、ステップサイズを調整する、二等分を使って最初のループの後に最後の場所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)) 

このMethodeのではあなたが唯一の1または2反復を持つことになります。もちろん、配列全体を合計します。