Matlab 获取每次迭代的fminsearch函数调用数

Matlab 获取每次迭代的fminsearch函数调用数,matlab,fminsearch,Matlab,Fminsearch,此代码将找到我的esm6函数的本地最小值,由于“显示”选项,它将输出如下字符串 迭代函数计数最小f(x)过程 01 36.9193 1 5 35.9815初始单工 2 7 35.4924内部合同 3.9 35.4924内部合同 4 11 33.0085扩展 因此,在命令窗口中,我得到每个迭代步骤的函数计数。由fminsearch创建的结构输出,其中只有func计数的总量。是否有一种方法可以接收所有在命令窗口和输出结构中输出的信息 编辑: 我想我已经接近解决方案了。我编写了这个输出函数: opti

此代码将找到我的esm6函数的本地最小值,由于“显示”选项,它将输出如下字符串

迭代函数计数最小f(x)过程
01 36.9193
1 5 35.9815初始单工
2 7 35.4924内部合同
3.9 35.4924内部合同
4 11 33.0085扩展

因此,在命令窗口中,我得到每个迭代步骤的函数计数。由fminsearch创建的结构
输出
,其中只有func计数的总量。是否有一种方法可以接收所有在命令窗口和输出结构中输出的信息

编辑:
我想我已经接近解决方案了。我编写了这个输出函数:

options = optimset('Display','iter','MaxIter',3,'OutputFcn',@outfun);
[x,fval,~,output] = fminsearch(@(param) esm6(param,identi),result(k,1:end-1),options);
因为这应该是可行的,但事实上,matlab告诉我

???对不存在的字段“funcount”的引用


你知道为什么会发生这种情况吗?

很肯定这不会解决你的问题,但是在比较字符串时,你应该使用
isequal
而不是
=
。你可以通过写
mystruct.field1
mystruct.field2
,。。。因此,您的错误意味着
optimvalues
是一个具有不同字段的结构,但没有名为funcount的字段。检查代码中定义
optimvalues
的部分。顺便说一下,我不太理解您的输出函数。您将
stop
定义为输出,但stop将始终等于0,因此该函数非常无用。@BillBokeey:
strcmp
可能是首选方法。@Max:联机文档适用于最新版本的Matlab。您是否查阅了本地版本文档,以确认输出函数的工作方式和参数相同?您是否尝试过将大小写降低到
optimvalues.funcount
?我认为在
optimvalues
output
结构中,字段的大写形式可能不同。这肯定不会解决您的问题,但在比较字符串时,您应该使用
isequal
而不是
=
当您通过写入
mystruct.field1
mystruct.field2
,。。。因此,您的错误意味着
optimvalues
是一个具有不同字段的结构,但没有名为funcount的字段。检查代码中定义
optimvalues
的部分。顺便说一下,我不太理解您的输出函数。您将
stop
定义为输出,但stop将始终等于0,因此该函数非常无用。@BillBokeey:
strcmp
可能是首选方法。@Max:联机文档适用于最新版本的Matlab。您是否查阅了本地版本文档,以确认输出函数的工作方式和参数相同?您是否尝试过将大小写降低到
optimvalues.funcount
?我认为该字段在
optimvalues
output
结构中的大写形式可能不同。
function stop = outfun(x,optimvalues,state);
    stop = false;
    if state == 'iter'
        history = evalin('base','history');
        history = [history; optimvalues.iteration optimvalues.funcCount];
        assignin('base','history',history);
    end
end