如何在 Matlab 中使用 onCleanup 保存变量?

Posted

技术标签:

【中文标题】如何在 Matlab 中使用 onCleanup 保存变量?【英文标题】:How to save variables with onCleanup in Matlab? 【发布时间】:2015-07-13 17:56:32 【问题描述】:

我有一个在集群上运行的 Matlab 脚本。如果时间超过某个时间点,它就会被杀死。我想在脚本被杀死之前使用 onCleanup 保存一些(或全部)变量。

我尝试了以下方法:

function [] = test
    ita = 5;
    finishup = onCleanup(@() save('test.mat','ita'));
    pause(7200);
    disp('done')
    exit
end

我认为变量“ita”在执行 onCleanup 之前被杀死,它没有找到该变量。如果我将函数转换为脚本,也会出现同样的情况。

ita = 5;
finishup = onCleanup(@() save('test.mat','ita'));
pause(7200);
disp('done')
exit

我怎样才能做到正确?

当然,如果我在函数中使用 onCleanup,那么它会在函数停止后立即执行(例如 ctrl+c)。如果我使用脚本,那么只有在 Matlab 退出时才会执行 onCleanup。

【问题讨论】:

这真的不是onCleanup 的设计行为。来自 MATLAB 的文档:“您的清理例程不应依赖于在该例程之外定义的变量。”这意味着,正如您所发现的,局部变量不能在清理函数中使用。你确定如果函数被杀死,onCleanup 会被调用吗?如果确实如此,我会感到惊讶,在这种情况下,这将不是您正在寻找的解决方案。 【参考方案1】:

我不会完全推荐这个......但它是您问题的解决方案。将ita 设置为global,然后使用子函数调用来进行清理/MAT 文件保存。这样ita 在范围内。

当函数完成或我在暂停期间按 Ctrl+C 时,此方法有效。

function [] = test()
    global ita
    ita = 5;
    finishup = onCleanup(@() cleanMe());
    pause(7200);
    disp('done')

function cleanMe()
global ita
save('test.mat','ita')

【讨论】:

以上是关于如何在 Matlab 中使用 onCleanup 保存变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在从 Matlab 调用的 mex 函数中使用 Matlab 引擎

如何在 Linux 终端中使用 MCR(Matlab 编译器运行时)运行 Matlab 文件?

MATLAB | 如何在MATLAB中使用python全部colormap配色

如何在 Matlab 中使用 libsvm?

mex 文件崩溃,如何在 matlab 中使用 MATLAB_MEM_MGR?

如何在 Matlab 中使用自定义内核,如卡方