gpt4 book ai didi

matlab - 如何将数据传递给 MATLAB oncleanup 函数?

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:07 33 4
gpt4 key购买 nike

我有一个已编译的 matlab 程序,可以自动调整机器参数。在调整周期结束时,我需要重新设置一些原始设置。有时会发生意外错误,有时用户会发现调整算法无法正常工作,因此应该终止(使用 control-C)。

如果发生可预测的错误,我可以使用 try catch block 恢复参数。但是,如果发生意外错误或用户调用 control-C,程序将退出而不通过 catch 子句,并且机器将处于未定义状态。

我知道我可以注册一个清理函数,它将在我的工作函数完成时运行,无论是正常情况下,通过可预测或不可预测的错误,或 control-C 事件。理想情况下,如果发生可预测的错误,清理功能将不执行任何操作并将控制权传递给顶层以进行清理。如果发生 control-C 事件或不可预知的错误,清理功能应警告用户程序失败,以便他们手动清理。

为此,我需要在运行时让清理函数知道预测或未预测终止(即 control-C)的事实。我知道清理函数在注册时会获取参数值的副本,并且这些值在运行时无法更改,因此传入参数无法正常工作。我认为应该工作的是将清理函数嵌套在我的工作函数中,以便清理函数可以使用封闭函数中的局部变量。然而,这是行不通的。

我的问题是:任何人都可以找到一种方法,使清理函数只使用一个 bool 值,以便它可以在正常清理和异常清理之间进行选择吗?

这是一些我认为应该可行的人为示例代码。

function do_tuning
% Set this false to cause a warning messages for control-C or MATLAB coding errors.
normalTermination = false;
oc = onCleanup(@() my_clean_up());
tuningError = tuning_function()
if tuningError
% Set this true to suppress the warning message if a predictable error occurs.
normalTermination = true;
error('tuningError')
end
% Set this true to suppress the warning message if the function runs to completion.
normalTermination = true;

function my_clean_up
if ~normalTermination
disp('Warning: clean up failed. Please clean up manually');
end
end
end

按照此模式运行真实代码会导致错误:

Undefined function or variable "normalTermination".

最佳答案

onCleanup 对象从 do_tuning 函数的工作区外部调用该函数,因此使用嵌套函数无济于事...事实上文档说明:

Your cleanup routine should never rely on variables that are defined outside of that routine

[编辑 - 基于评论] 更好的解决方案是改变问题并在 my_clean_up 函数中完成所有清理,这可能需要它确定是否需要做什么(或具有可以始终应用的通用行为)

如果我们忽略此警告并解决问题...

使用 global 在工作区之间传递变量是最简单的变量 so 对于上面的示例代码。首先将变量定义为全局变量之前最初将其设置为false(否则变量可能会被覆盖)

function do_tuning
%# snip
global normalTermination
normalTermination = false;
%# snip

然后在 my_clean_up 回调函数中将变量定义为全局变量然后使用它来检索值

function my_clean_up
global normalTermination
if ~normalTermination
%# snip

警告 与全局变量一样,这很容易受到在错误时间在其他地方编辑的全局变量值的影响。

关于matlab - 如何将数据传递给 MATLAB oncleanup 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23265495/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com