在Matlab中,是否可以终止一个脚本,但是将其所有内部变量保存到工作区?

18

我正在运行一个脚本,但它花费的时间太长了,所以我想终止脚本。然而,它已经计算了很多数据,我不想扔掉这些数据。有没有类似于ctrl-C的替代方法,可以将内部函数变量保存到工作区中?

理想情况下,我正在寻找像ctrl-C这样的Matlab键盘快捷方式,但如果实在无法实现,也许在我的功能脚本中有一种方法可以做到这一点。有没有办法让我的脚本对ctrl-C做出反应,或者可能有一个GUI元素,我可以取消然后通过我的脚本保存变量?

我找到了一些类似的问题,但它们都没有回答我的问题:

close/pause

terminate

不同的问题,相似的答案:

dbstop

编辑:

这个问题不同,因为提问者的问题不同:他们想知道错误出在哪里,而在我的情况下,Matlab已经说了。我只是想在发生这种情况时保留所有工作内存中的数据。


我认为你做不到这一点:http://forums.codeguru.com/showthread.php?383556-Matlab-breakpoint-at-running-function 提供了一些未来的建议。你可以考虑定期将所有变量保存到一个文件中,这样如果你遇到这种情况,你可以在中断后查看该文件。虽然今天对你没有帮助,但这是一个向Mathworks发送的好功能请求! - Dan
你无法在MATLAB中捕获ctrl-c。对于替代方案,也许这个链接会有所帮助:http://www.mathworks.com/matlabcentral/newsreader/view_thread/246784 - sebastian
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - horchler
@horchler 尽管他们的解决方案相同,但问题并不一样。他们基本上想知道错误的起源,而我想在出现错误时保存工作内存中的数据。 - Leo
3个回答

37

MATLAB 2016a及以上版本

如果您使用的是MATLAB 2016a及以上版本,实际上运行脚本时会出现一个暂停按钮(如@pedre所述)。这允许您暂停脚本,检查变量,然后在之后恢复运行。

请确保查看下一节,因为这仍然很方便。

旧版MATLAB

实际上,诀窍是使用dbstop if error

首先使用此功能,然后运行您的脚本。一旦引入错误(例如,使用Ctrl+C),您就有机会手动检查/保存工作空间。

您将无法恢复脚本。


在阅读了很多“你不能这样做”的内容后,这个答案比我预期的要好得多,谢谢!如果我将其作为函数体内的第一个命令运行,它也能正常工作吗? - Leo
2
@Leo 我认为你可以在出现错误之前随时调用它,尽管在常规函数中放置调试命令有点奇怪。就我个人而言,在我的startup.m中加入这个调试功能后,我的效率显著提高了。(如果发生破坏代码的错误,99%的情况下我都想查看)。 - Dennis Jaheruddin
您也可以在GUI中找到这些调试选项。 编辑器>断点。 您还可以在警告时中断,或在脚本的特定位置设置断点,甚至是条件断点。 值得知道如何使用这些。 - Bernhard
有人试图编辑我的帖子告诉我解决方案“对2015b无效”。我现在无法访问2015b,但如果dbstop if error突然被取消,我会感到非常惊讶。--如果您觉得这个答案非常不完整,请考虑添加一个答案,以便人们可以获得好处并进行评论。 - Dennis Jaheruddin

3
你只需点击脚本内部即可打开编辑器页面,然后按暂停键,在那里查看所有的内部值。
请看以下内容:

enter image description here


1
有许多用户正在使用旧版本的MATLAB(R2016a之前)。我建议您添加一条注释,说明它是在R2016a发布中引入的。请查看此答案:https://dev59.com/QnA75IYBdhLWcg3weZDu#36074605。 - Stewie Griffin
欢迎来到SO,并感谢您的回答!=)小提示:像“我遇到了同样的问题…”等句子被认为是噪音,因为它并没有为答案增加任何信息。SO与许多其他论坛和问答网站有所不同,因为它专注于问题和答案本身,而不是个人方面。这样做的原因是问题和答案是为了未来的访问者而存在的,而不仅仅是提出具体问题的人。例如,以“嗨,我有一个问题,已经尝试了2个小时…”开头的问题对于任何阅读该问题的人来说都是噪音。 - Stewie Griffin
由于您无法自己添加图片,我包含了一个暂停按钮的屏幕截图。如果您不喜欢我的编辑,编辑部分中有一个“回滚”选项。您可以通过在答案下方按“编辑”来编辑问题。无论如何,这个+1是来自我的 =) - Stewie Griffin

2

我的同事向我展示了一种将此功能整合到我的函数中的替代方法,即通过将save()命令附加到waitbar的取消操作中:

%appoint emergency file location
emergencysave = char(inputdlg({'fill in here:'}, 'windowtitle', 1, 'c:\defaultstringhere.mat'));

%or just emergencysave = 'c:\emergencysave.mat';



%create some GUI element you can cancel
times = 10;
wbinfo = struct('curlength', {0.0});
wb = waitbar(wbinfo.curlength);
wbinfo.wb = wb;



%attach save() to cancelling
anyimportantvariable = [];
for i=1:times
    anyimportantvariable = [anyimportantvariable, i^2];
    wbinfo.curlength = i/times;
    try
        waitbar(wbinfo.curlength, wb)
    catch
        save(emergencysave, 'anyimportantvariable');
        return;
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接