Matlab 2016b:使用结构的循环比使用变量的循环慢得多

Matlab 2016b:使用结构的循环比使用变量的循环慢得多,matlab,profiling,Matlab,Profiling,我正在计算一个变量u的错误统计列表。每当我将结构放入循环中时,Matlab就会变成超流,而使用标准变量时速度非常快。我听说Matlab2016b既可以使用循环,也可以使用矢量符号,速度应该是相同的。看起来它对结构不起作用。你知道为什么吗?这里有最好的建议吗?这是一个最小的例子(我只使用了微不足道的“if”子句,我的子句更复杂,这是我不进行矢量化的主要原因): JIT编译器由特定代码触发。如果JIT编译器不知道如何优化代码(例如,因为它有结构),它将不会“自动矢量化”代码,因此不会有加速。我想这就

我正在计算一个变量u的错误统计列表。每当我将结构放入循环中时,Matlab就会变成超流,而使用标准变量时速度非常快。我听说Matlab2016b既可以使用循环,也可以使用矢量符号,速度应该是相同的。看起来它对结构不起作用。你知道为什么吗?这里有最好的建议吗?这是一个最小的例子(我只使用了微不足道的“if”子句,我的子句更复杂,这是我不进行矢量化的主要原因):


JIT编译器由特定代码触发。如果JIT编译器不知道如何优化代码(例如,因为它有结构),它将不会“自动矢量化”代码,因此不会有加速。我想这就是所发生的事情。在迭代中访问结构也可以解释这个问题。JIT编译器会被特定的代码触发。如果JIT编译器不知道如何优化代码(例如,因为它有结构),它将不会“自动矢量化”代码,因此不会有加速。我想这就是正在发生的事情,在迭代中访问结构也可以解释这个问题。
    n = 1000,
    m = 1000;
    uMODEL = rand(n,m);
    uOBS = rand(n,m);
    %
    %
    %
    tic
    ERRORS = struct('Emedio',0,'MAE',0,'sigma',0,'Emax',0,'Emin',0);
    Nerr(1:max(n,1),1) = 0; %Nerr at most it contains n
    fields = fieldnames(ERRORS);
    for i = 1:numel(fields)
        ERRORS.(fields{i}) = zeros(max(n,1),1);
    end

    for i=1:m
        for j=1:n
        if (1000>2 && 2000<343532)
            diff  = uMODEL(j,i)-uOBS(j,i);
            ERRORS.Emedio(j) = ERRORS.Emedio(j) + diff;
            ERRORS.MAE(j)    = ERRORS.MAE(j)     + abs(diff);
            ERRORS.sigma(j)  = ERRORS.sigma(j)  + diff^2;
            ERRORS.Emax(j)  = max(ERRORS.Emax(j),diff);
            ERRORS.Emin(j) = min(ERRORS.Emin(j),diff);
            Nerr(n)    = Nerr(n) + 1;
        end
        end
    end
    ERRORS.Emedio(:) = ERRORS.Emedio(:)./Nerr(:);
    ERRORS.MAE(:)    = ERRORS.MAE(:)./Nerr(:);
    ERRORS.sigma(:)  = sqrt(ERRORS.sigma(:)./(Nerr(:)-1));


    toc
    clear  ERRORS
    tic
    %
    % here instead I define variables, I fill them up and then I throw them in structures, cause loops with structures are strangely slow...
    Emedio = zeros(max(n,1),1);
    MAE = zeros(max(n,1),1);
    sigma = zeros(max(n,1),1);
    Nerr = zeros(max(n,1),1);
    Emax = zeros(max(n,1),1);
    Emin = zeros(max(n,1),1);

    for i=1:m
        for j=1:n
        if (1000>2 && 2000<343532)
            diff  = uMODEL(j,i)-uOBS(j,i);
            Emedio(j) = Emedio(j) + diff;
            MAE(j)    = MAE(j)     + abs(diff);
            sigma(j)  = sigma(j)  + diff^2;
            Emax(j)  = max(Emax(j),diff);
            Emin(j) = min(Emin(j),diff);
            Nerr(n)    = Nerr(n) + 1;
        end
        end
    end
    Emedio(:) = Emedio(:)./Nerr(:);
    MAE(:)    = MAE(:)./Nerr(:);
    sigma(:)  = sqrt(sigma(:)./(Nerr(:)-1));

    ERRORS.Emedio(:) = Emedio(:);
    ERRORS.MAE(:)    = MAE(:);
    ERRORS.sigma(:)  = sigma(:);
    ERRORS.Emax(:)   = Emax(:);
    ERRORS.Emin(:)   = Emin(:);
    toc
  Elapsed time is 2.372765 seconds.
  Elapsed time is 0.057719 seconds.