【问题标题】:Matlab's FOR loop iteration time increasesMatlab FOR循环迭代时间增加
【发布时间】:2023-03-11 18:25:01
【问题描述】:

我正在尝试跨越某个多变量函数的值 f(nu,delta,Omega,kappa,Gamma)。代码如下:

% PREALLOCATE RESULT MATRIX

N = 10;
d = 0.1;

M = zeros(4*N/d+(2*N+1)/d,6);

% SET UP LOOP INDICES

i=1;
increm=1;

% LOOP OVER MULTIPLE VARIABLE

for nu=d:d:N
    for delta=-N:d:N
        for Omega=d:d:N
            for kappa=d:d:N
                tic
                for Gamma=d:d:N

                % CALCULATE THE FUNCTION 

                mss = ((Gamma+kappa).*((Gamma+kappa).^2+4.*(delta+(-1).*nu).^2).^(-1)+( ...
                  -1).*(Gamma+kappa).*((Gamma+kappa).^2+4.*(delta+nu).^2).^(-1)+( ...
                  kappa.^2+4.*(delta+(-1).*nu).^2).^(-1).*(((2.*Gamma+kappa).^2+4.*( ...
                  delta+(-1).*nu).^2).*(kappa.*(Gamma+kappa).*(2.*Gamma+kappa)+4.*(( ...
                  -1).*Gamma+kappa).*(delta+(-1).*nu).^2)+4.*(kappa.*(2.*Gamma+ ...
                  kappa).^2+4.*(4.*Gamma+kappa).*(delta+(-1).*nu).^2).*Omega.^2).*( ...
                  16.*(delta+(-1).*nu).^4+4.*(delta+(-1).*nu).^2.*((Gamma+kappa).^2+ ...
                  (2.*Gamma+kappa).^2+(-8).*Omega.^2)+((Gamma+kappa).*(2.*Gamma+ ...
                  kappa)+4.*Omega.^2).^2).^(-1)+(-1).*(kappa.^2+4.*(delta+nu).^2).^( ...
                  -1).*(((2.*Gamma+kappa).^2+4.*(delta+nu).^2).*(kappa.*(Gamma+ ...
                  kappa).*(2.*Gamma+kappa)+4.*((-1).*Gamma+kappa).*(delta+nu).^2)+ ...
                  4.*(kappa.*(2.*Gamma+kappa).^2+4.*(4.*Gamma+kappa).*(delta+nu).^2) ...
                  .*Omega.^2).*(16.*(delta+nu).^4+4.*(delta+nu).^2.*((Gamma+kappa) ...
                  .^2+(2.*Gamma+kappa).^2+(-8).*Omega.^2)+((Gamma+kappa).*(2.*Gamma+ ...
                  kappa)+4.*Omega.^2).^2).^(-1)).^(-1).*((Gamma+kappa).*((Gamma+ ...
                  kappa).^2+4.*(delta+nu).^2).^(-1)+(kappa.^2+4.*(delta+nu).^2).^( ...
                  -1).*(((2.*Gamma+kappa).^2+4.*(delta+nu).^2).*(kappa.*(Gamma+ ...
                  kappa).*(2.*Gamma+kappa)+4.*((-1).*Gamma+kappa).*(delta+nu).^2)+ ...
                  4.*(kappa.*(2.*Gamma+kappa).^2+4.*(4.*Gamma+kappa).*(delta+nu).^2) ...
                  .*Omega.^2).*(16.*(delta+nu).^4+4.*(delta+nu).^2.*((Gamma+kappa) ...
                  .^2+(2.*Gamma+kappa).^2+(-8).*Omega.^2)+((Gamma+kappa).*(2.*Gamma+ ...
                  kappa)+4.*Omega.^2).^2).^(-1));

                % STORE THE RESULT

                M(i,:) = [mss nu delta Omega kappa Gamma];

                i = i+increm;

                end
            end
            toc
        end
    end
end

save M

但是,预分配无助于每次迭代花费更长的时间。当我运行代码并过早中断它时,迭代需要

Elapsed time is 0.003354 seconds.
Elapsed time is 0.006374 seconds.
Elapsed time is 0.009043 seconds.
Elapsed time is 0.012092 seconds.
Elapsed time is 0.015287 seconds.
Elapsed time is 0.019239 seconds.
Elapsed time is 0.023898 seconds.
Elapsed time is 0.035345 seconds.
Elapsed time is 0.046675 seconds.
Elapsed time is 0.056000 seconds.
Elapsed time is 0.066323 seconds.
Elapsed time is 0.072178 seconds.
Elapsed time is 0.075174 seconds.
Elapsed time is 0.081095 seconds.
Elapsed time is 0.095016 seconds.
Elapsed time is 0.095214 seconds.
Elapsed time is 0.100089 seconds.
Elapsed time is 0.104286 seconds.
Elapsed time is 0.109454 seconds.
Elapsed time is 0.115368 seconds.
Elapsed time is 0.124278 seconds.
Elapsed time is 0.131521 seconds.
Elapsed time is 0.135023 seconds.
Elapsed time is 0.137370 seconds.
Elapsed time is 0.145331 seconds.
Elapsed time is 0.163449 seconds.
Elapsed time is 0.162654 seconds.
Elapsed time is 0.159628 seconds.
Elapsed time is 0.166585 seconds.

我不明白变量本身的变化是如何导致这种情况的,因为唯一的变化量是 d,这应该不会比计算 mss 的新值更难之前的互动。

【问题讨论】:

    标签: matlab loops for-loop


    【解决方案1】:

    您没有预先分配足够大的数组!

    如果你执行以下嵌套循环

    for ii=1:3
       for jj = 1:4
           doSomething()
       end
    end
    

    doSomething 被执行 3*4=12 次。使用您的分配方案,您将分配 3+4=7 次。

    换句话说,将您的预分配更改为

    M = zeros((N/d)^4*(2*N+1)/d,6);
    

    一切都会好起来的。

    【讨论】:

    • 只是想补充 Jonas 的答案:迭代开始花费更多时间的原因是您的输出数组不足以容纳结果。因此,当您开始添加更多结果时,在每次迭代中,MATLAB 都会分配一个新的、更大的数组来保存结果,并释放前一个数组。数组大小随着每次迭代而增长,因此分配新数组需要的时间越来越长。如果你一开始就预先分配整个东西,你只需要分配一次。
    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 2017-02-09
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多