2017-01-18 17 views
1

私のプログラムでは、私は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 
+1

ループインデックスを減らして問題を示すのに十分な大きさのままにしておくと、matlabのプロファイラの出力はどのようになりますか? –

+1

ブレークポイントバーを右クリックすることで '条件付きブレークポイント 'を試すことができます。 'i == 3944 && j == 8153'を設定して、ステップバイステップで問題の発生箇所を確認することができます。 – Adiel

答えて

0

を聞くのを楽しみにしています助けのためにありがとうございました。私は問題を理解した。それが固まるところで、MAtlabは負の数の平方根を計算し、複素数を取得しようとしています。そして、この仕事に多大な努力を費やしています。私は簡単なコード化によってこれらの数字を避け、非常に急速に動いています。

関連する問題