私のプログラムでは、私は5823x8153回実行する必要があるforループを持っています。 forループは、i = 3944とj = 8153になるまでかなり速く実行されます。しかし、この点の後、forループは非常にゆっくりと実行されています。私は事前割り当てやいくつかの変数を計算する前にforループのようないくつかの加速メソッドを試してみましたが、うまくいきませんでした。 forループの問題は次のようになります。この問題について私に助けてください。ちなみに、同じデータの小さな部分(1000x1000または3000x3000)でうまく動作し、64GB RAMのワークステーションを使ってこのプログラムを実行します。私はあなたからforループのいくつかの繰り返しの後、Matlabは非常に遅く(ほとんどスタックしません)実行します。
ro1 = (180*3600)/pi;
ro = ro1^2;
sigma_h = horizontal_prec_secs;
sigma_v = vertical_prec_secs;
error_ellip_dim = nan(5823,8153,3);
for i = 1:5823
for j = 1:8153
sigma_r = range_precision(i,j);
h = horizontal_angle(i,j);
v = vertical_angle(i,j);
r = range(i,j)*1000;
if (isnan(h))||(isnan(sigma_r))
error_ellip_dim(i,j,:) = NaN;
else
EXX(1,1) = sigma_r^2*COSDH(i,j)^2*COSDV(i,j)^2 + (r^2*sigma_h^2*COSDV(i,j)^2*SINDH(i,j)^2)/ro + (r^2*sigma_v^2*COSDH(i,j)^2*SINDV(i,j)^2)/ro;
EXX(1,2) = sigma_r^2*COSDH(i,j)*COSDV(i,j)^2*SINDH(i,j) - (r^2*sigma_h^2*COSDH(i,j)*COSDV(i,j)^2*SINDH(i,j))/ro + (r^2*sigma_v^2*COSDH(i,j)*SINDH(i,j)*SINDV(i,j)^2)/ro;
EXX(1,3) = COSDH(i,j)*COSDV(i,j)*SINDV(i,j)*sigma_r^2 - (r^2*sigma_v^2*COSDH(i,j)*COSDV(i,j)*SINDV(i,j))/ro;
EXX(2,1) = EXX(1,2);
EXX(2,2) = sigma_r^2*COSDV(i,j)^2*SINDH(i,j)^2 + (r^2*sigma_h^2*COSDH(i,j)^2*COSDV(i,j)^2)/ro + (r^2*sigma_v^2*SINDH(i,j)^2*SINDV(i,j)^2)/ro;
EXX(2,3) = COSDV(i,j)*SINDH(i,j)*SINDV(i,j)*sigma_r^2 - (r^2*sigma_v^2*COSDV(i,j)*SINDH(i,j)*SINDV(i,j))/ro;
EXX(3,1) = EXX(1,3);
EXX(3,2) = EXX(2,3);
EXX(3,3) = sigma_r^2*SINDV(i,j)^2 + (r^2*sigma_v^2*COSDV(i,j)^2)/ro;
[eig_vec_mat,eig_val_mat] = eig(EXX);
ellip_params = sqrt(diag(eig_val_mat));
error_ellip_dim(i,j,:) = ellip_params';
end
end
i
j
end
ループインデックスを減らして問題を示すのに十分な大きさのままにしておくと、matlabのプロファイラの出力はどのようになりますか? –
ブレークポイントバーを右クリックすることで '条件付きブレークポイント 'を試すことができます。 'i == 3944 && j == 8153'を設定して、ステップバイステップで問題の発生箇所を確認することができます。 – Adiel