それはあなたのコードで結果を計算するためにループでの反復がかかります。コードをベクトル化することで、スピードアップに役立ちます。私の次のコードはあなたがやったことを正確に行いますが、計算をかなりベクトル化します。それが役立つかどうかを見てください。
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秒です。
あなたの関数が高調波の合計を計算していることに気づいたのかどうかわかりません。ですから、繰り返し回数が多い場合は、sum(1 ./(1:#iteration))= stopCritまで合計を調整するなどしてください。 – obchardon