我正在使用fminsearch来找到问题的最佳解决方案,并且由于某些原因与问题无关,我是按部分进行的,重复调用fminsearch。所以,每次调用它时,我都可以访问函数(fval)的值(程序打印fval)。问题是,有时我会看到fval如何增加并偏离最佳状态,在这种情况下我想制作并输入并告诉程序转到下一个案例(休息)。
我不能包括,如果那个状态如果fval增加则转到下一个案例,因为有时它会增加并结束收敛到最优解。而且我无法提出并输入询问我是否想要在每次迭代中继续,这个过程将会很长并且我必须整天都在电脑前
想法? 感谢
答案 0 :(得分:2)
这个想法是使用一些GUI元素(比如按钮),因为它们的动作可以异步中断当前运行的代码。
为了说明我的意思,这里有一些代码应该复制到名为main_loop.m
的文件中,然后运行:
%// Main function
function main_loop()
%// Create pushbutton user interface
h_btn = uicontrol( ...
'Style', 'pushbutton', ...
'String', 'Go Next', ...
'Parent', figure(), ...
'Callback', @cb_function ...
);
%// Create flag in button application data, with value
%// = false: continue looping;
%// = true: break the current loop.
setappdata(h_btn, 'flag', false);
%// Loop simulation
for k = 1:10
for p = 1:10000
%// Simulation of calculation
pause(0.1);
disp([k,p]);
%// If button hit, reset flag and break
if getappdata(h_btn, 'flag')
setappdata(h_btn, 'flag', false);
break;
end;
end;
end;
end
%// Button callback
function cb_function(h_btn, ~)
%// Set flag to request a loop break
setappdata(h_btn, 'flag', true);
end
基本上,在按钮的应用程序数据中创建一个标志:按钮的动作将设置标志,而主循环检查此标志以决定是继续还是中断。请注意,在打破内循环之前,标志会被重置。
请阅读评论,以确定插入代码的位置;另外,根据您的喜好更改循环(例如while
而不是for
,乘法嵌套循环等。)