我正在研究优化问题,目前使用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,它会产生负面影响。此外,我可以访问任何必要的工具箱或功能,因为项目发起人将为此付费!