循环中的大型计算,MATLAB

时间:2014-09-19 18:44:26

标签: matlab loops optimization

我正在研究优化问题,目前使用fmincon来最小化相对复杂的目标函数。这个问题可能需要一天才能收敛,因此我决定用梯度向量和Hessian矩阵提供求解器(fmincon)。到目前为止,我的速度增加了三倍,但我认为有一种方法可以优化以下代码来计算我的渐变向量并调用超过一百万次:

gradf = zeros(1,length(ftprm));
if nargout > 1
    %% gradient with respect to q0s
    for j=1:nprd
        s = 0;
        for n = 1:nstgs
           s = s + 2 * (obsQ(n,j) - Q(n+1,j)) * exp(-n/tau(j));
        end
        gradf(1,j) = -s;
    end
    %% gradient with respect to taus
    for j = 1:nprd
        s = 0;
        dqjndtauj = 0;
        for n = 1:nstgs
            FijIin = sum(F((j-1)*ninj+1:j*ninj).*injpls(n,:));
            dqjndtauj = dqjndtauj * exp(-1/tau(j)) + ...
                 Q(n,j)*1/tau(j)^2 * exp(-1/tau(j)) - ...
                 1/(tau(j)^2)*exp(-1/tau(j))*FijIin;
            s = s + 2 * (obsQ(n,j) - Q(n+1,j)) * dqjndtauj;
        end
        gradf(1,nprd+j) = -s;
    end
    %% gradient with respect to Fis
    for j = 1:nprd
        for i = 1:ninj
            s1 = 0;
            for n = 1:nstgs
                s2 = 0;
                for k = 1:n
                    s2 = s2 + exp(-(n-k)/tau(j))*(1-exp(-1/tau(j)))*injpls(k,i);
                end
                s1 = s1 + 2*(obsQ(n,j)-Q(n+1,j))*s2;
            end
            gradf(1,2*nprd+(j-1)*ninj+i)=-s1;
        end
    end
end

我的问题很简单:减少此代码的计算时间的最佳方法是什么?顺便说一句,fmincon已经在使用并行计算了,我知道如果我在这种情况下使用parfor,它会产生负面影响。此外,我可以访问任何必要的工具箱或功能,因为项目发起人将为此付费!

0 个答案:

没有答案