在for循环中进行一些迭代后,Matlab运行速度非常慢(几乎停滞)



在我的程序中,我有一个for循环,它必须运行5823x8153次。for循环运行得相当快,直到i=3944和j=8153。然而,在这一点之后,for循环运行得非常缓慢,几乎在这一点将卡住。我尝试了一些加速方法,比如预分配和在for循环之前计算一些变量,但都不起作用。有问题的for循环如下所示。你能帮我解决这个问题吗?顺便说一句,它适用于相同数据的小部分(1000x1000或3000x3000),我使用64GB RAM的工作站运行这个程序。我期待着收到你的来信

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正试图计算负数的平方根,并得到复数。它为这份工作付出了巨大的努力。我通过简单的编纂避免了这些数字,而且它运行得相当快。

最新更新