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

在for循环中进行一些迭代之后,Matlab的运行速度非常慢(几乎停滞),matlab,for-loop,ram,Matlab,For Loop,Ram,在我的程序中,我有一个for循环,它必须运行5823x8153次。for循环运行得相当快,直到i=3944和j=8153。然而,在这一点之后,for循环运行得非常慢,几乎在这一点上停止。在for循环之前,我尝试了一些加速方法,比如预分配和计算一些变量,但没有成功。下面给出了有问题的for循环。你能帮我解决这个问题吗?顺便说一下,它适用于相同数据的小部分(1000x1000或3000x3000),我使用带有64GB RAM的工作站运行此程序。我期待着收到你的来信 ro1 = (180*3600)/

在我的程序中,我有一个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试图计算负数的平方根并得到复数。它为这项工作付出了巨大的努力。我通过一个简单的编码避免了这些数字,它运行得非常快。

当您减少循环索引以允许它完成时,matlab的profiler的输出是什么,但让它们足够大以演示问题?您可以通过右键单击断点栏来尝试
条件断点
。您可以设置
i==3944&&j==8153
,然后逐步查看问题发生的位置。