Octave 什么';八度音程中输出属性的正确使用是什么?

Octave 什么';八度音程中输出属性的正确使用是什么?,octave,Octave,使用fminunc时,我不确定输出有什么用 >>options = optimset('GradObj','on','MaxIter','1'); >>initialTheta=zeros(2,1); >>[optTheta, functionVal, exitFlag, output, grad, hessian]= fminunc(@CostFunc,initialTheta,options); >> output output = sca

使用
fminunc
时,我不确定输出有什么用

>>options = optimset('GradObj','on','MaxIter','1');
>>initialTheta=zeros(2,1);
>>[optTheta, functionVal, exitFlag, output, grad, hessian]= 
fminunc(@CostFunc,initialTheta,options);

>> output
output =
scalar structure containing the fields:
    iterations = 11
    successful = 10
    funcCount = 21
即使我使用了最大迭代次数
iteration=1
,它仍然没有给出迭代次数
iteration=11

谁能解释一下为什么会这样?
请帮助我使用
grad
hessian
属性,这也意味着使用这些属性。

鉴于我们没有完整的代码,我认为要准确理解正在发生的事情,最简单的方法是在
fminunc.m
本身中设置一个断点,并遵循代码的逻辑。这是使用Octave的一个好处,因为提供了源代码,您可以自由地检查它(实际上,Octave源代码中经常有有用的信息,例如他们在实现时所依赖的文件的引用,等等)

快速查看,似乎
fminunc
不需要
maxiter
为1。请看第211行:

211   while (niter < maxiter && nfev < maxfev && ! info)
这使用“快捷方式评估”,首先检查上一次迭代是否“不成功”,然后再检查迭代次数是否小于“maxiter”

换言之,如果上一次迭代成功,则根本无法运行内部循环,也永远无法递增
niter

根据以下(非连续)行,“实际减少量与预测减少量”的比率似乎定义了迭代“成功”的标志:

换句话说,fminunc似乎会尊重你的maxiters,不管它们是“成功的”还是“不成功的”,但它不喜欢在“成功的”回合“结束”算法(因为在检查maxiters条件之前需要先满足成功条件)

显然,这是一个学术观点,因为你甚至不应该进入这个内部循环,当你甚至不能通过外部循环的时候

在不知道具体代码的情况下,我无法确切地知道发生了什么,但是如果在fminunc处使用断点运行代码,您应该能够很容易地理解。该实现背后的数学可能很复杂,但代码本身似乎相当简单和直观


祝你好运

另外,不用说,如果你知道发生了什么,并且觉得这代表了一个bug,那么可以通过在octave tracker提交bug报告来为项目做出贡献!:)嗨@MdArif,我不知道你的意思。你是在问我如何调试倍频程代码吗?好的@Tasos Papastylanou我想我是在开一个没人会笑的玩笑。
272     while (! suc && niter <= maxiter && nfev < maxfev && ! info)
286         actred = (fval - fval1) / (abs (fval1) + abs (fval));
...
295         prered = -t/(abs (fval) + abs (fval + t));
296         ratio = actred / prered;
...
321       if (ratio >= 1e-4)
322         ## Successful iteration.
...
326         nsuciter += 1;
...
328       endif
329
330       niter += 1;