我正在尝试将lsqnonlin()函数与符号数学工具箱一起使用。具体来说,我尝试执行以下操作:
global func
func = GetMyFunc();
options = optimset('Disp','iter','UseParallel',true,'TolFun',1e-8,'FinDiffType','central');
[x,resnorm,unused,exitflag] = lsqnonlin(@(x) LossFunction(x,data1,data2,data3,data4),x0,lb,ub,options);
LossFunction()在单独的.m文件中定义为
function LossFunction(x,data1,data2,data3,data4)
global func
w = 1./data4;
LF = w.*(data1 - func(data2,data3,x(1),x(2),x(3),x(4),x(5)));
end
GetMyFunc也在一个单独的.m文件中定义:
function MyHandle = GetMyFunc()
syms x y z
AA = x.*y + z.^6.*y.^12;
BB = x.^4 - y.*x*z;
CC = diff(BB,x);
DD = diff(AA,z) + diff(AA,y);
EE = matlabFunction(CC);
FF = matlabFunction(DD);
MyHandle = @(x,y,z) double(EE(x,y,z) + FF(x,y,z));
end
data1,data2,data3和data4是大(约(80000x1))个向量。 我遇到的问题是,一旦调用lsqnonlin(),Matlab就会冻结。我已经尝试将func作为LossFunction()的附加参数传递,而不是将其定义为全局。但是,Matlab似乎仍在冻结。 如果我在.m文件中保存(简化)func一切正常,只有在我尝试使用函数句柄时才会出现问题。
以上表达式已简化。我的实际函数是一个非常大的函数,对于我想要做的事情,不可能将func保存到.m文件中。 (我试过这个但是func似乎太大了)。
我认为问题是func非常庞大,因此评估需要很长时间 有谁知道如何有效地做到这一点/提高性能?任何帮助将不胜感激。