我需要使用fminunc
运行优化过程1000次,这意味着我实际上使用for循环来循环优化过程1000次。有时,我会收到如下错误:
Error using fminusub (line 16)
Objective function is undefined at initial point. Fminunc cannot continue.
或其他错误:
Error using chol
Matrix must be positive definite.
现在,很明显这些是两种不同类型的错误,当其中任何一个出现时,该函数将退出for循环,这对我来说再次重启整个过程很痛苦。我想知道是否可以运行一个语句来尝试捕获所有错误并再次重新启动该单个优化过程直到它顺利运行而不会遇到任何错误。
我今天刚刚拿起了matlab,我不知道该怎么做?这甚至可能吗?
到目前为止,这就是我的想法:
try
% optimization process
fminunc(.....)
% if it fails
catch err
% regenerate a new initial values then restart optimization process
initial_para = randn(1)
fminunc(...., initial_para)
% PROBLEM is: what if it fails again in the catch statement , how can I try and catch that
end
答案 0 :(得分:1)
此代码的特殊之处在于try和catch块之间的唯一区别是您生成新的初始参数。所以你需要做的就是解决问题。问题实际上是你有错误的初始参数,给出问题中的代码。这是你必须解决的问题。解决这个问题的方法实际上是使用while循环,直到它工作。因此,您应该使用您拥有的代码,而不是创建新的初始参数并重复与try相同的过程。否则你会被迫使用递归(我真的不会使用try-catch的递归!调试会非常痛苦)。好的,但你做了什么:修复catch中的问题(这意味着设置一个新的初始值)并重复该过程直到它工作。
success = false;
while (~success)
try
% optimization process
fminunc(.....);
success = true;
catch err
% regenerate a new initial values then restart optimization process
initial_para = randn(1);
end
end
因此,如果try块中的代码有效,代码将只会到达success=true
。否则它将直接进入catch区块。