2017-01-18 1 views
1

내 프로그램에서 5823x8153 번 실행해야하는 for 루프가 있습니다. for 루프는 i = 3944 및 j = 8153이 될 때까지 매우 빠르게 실행됩니다. 그러나이 지점 이후에 for 루프는 매우 느리게 실행되어 거의이 시점에서 멈 춥니 다. 사전 할당과 같은 몇몇 가속 방법을 시도하고 for 루프 앞에 몇 가지 변수를 계산했지만 작동하지 않았습니다. 문제가되는 for 루프는 다음과 같습니다. 이 문제에 대해 저를 도울 수 있습니까? 그건 그렇고, 그것은 작은 부분 (1000x1000 또는 3000x3000) 같은 데이터의 좋은 작품과 나는 64GB의 RAM이있는 워크 스테이션을 사용 하여이 프로그램을 실행합니다. 귀하의 의견을 기다리고 있습니다.Matlab은 for 루프에서 약간의 반복 후 매우 느리게 실행됩니다 (0122).

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은 음수의 제곱근을 계산하고 복소수를 얻으려고합니다. 그리고이 직업에 많은 노력을 기울이고 있습니다. 나는이 숫자들을 간단한 목록 화법으로 피하고 매우 빠르게 달리고있다.

관련 문제