如何清除子函数中的持久变量

Posted

技术标签:

【中文标题】如何清除子函数中的持久变量【英文标题】:How to clear persistent variables in sub-functions 【发布时间】:2015-09-09 07:46:34 【问题描述】:

我有一个调用函数的脚本,该函数写在单独的文件中,并且包含仅在主函数内部的子函数。在我的一个子功能中,我有一个持久变量,每次运行主脚本时我都想清除它。我该怎么做?此外,我的代码中有断点,我希望在清除持久变量时保留它们 - 怎么做?

MainScript.m 脚本:

clear variables;
for iterNum=1:5
   dataOut = MyMainFunction(iterNum);
end
disp(dataOut);

MyMain函数代码:

function dataOut = MyMainFunction(iterNum)
   if (iterNum==1)
      clear MySubFunction;
   end
   dataOut = MySubFunction();
end

function dataOut = MySubFunction()
   persistent idx;
   if isempty(idx)
      idx=1;
   end
   dataOut=idx;
   idx=idx+1;
end

我想在每次运行 MainScript.m 时清除“idx”持久变量,但当然要在脚本运行期间保留该变量。

谢谢,约翰

【问题讨论】:

【参考方案1】:

我看到的最简单的方法是在函数名后面调用clear

clear MySubFunction

而不是

clear variables;

这应该清除该特定函数中的所有持久变量。这可能会产生删除存储的 JIT 副本的副作用,导致它在下次调用时被重新解析。

如果您之前 mlock'ed 函数,则可以使用 munlock

您可以在函数中定义一组特殊的参数,这些参数旨在单独清除持久变量,并在主文件的开头使用此语法调用函数。

【讨论】:

我会使用第二个选项 - 在参数列表中添加一个 init 标志,在该标志下清除持久变量,然后函数退出。 @Naveh:嗯,我已经按照你的建议做了,但是这些解决方案有两个问题:1)我不能在 MainScript.m 中调用“Clear MySubFunction”,因为脚本不知道它,但是只有 MyMainFunction 是已知的。 2)我尝试按照您的建议在参数列表中使用一些特殊的初始化标志在 MyMainFunction 中调用“Clear MySubFunction”,但问题是它仍然不起作用,并且持久变量仍然没有重置。 @J.Smith,将您的持久化idx 设为MyMainFunction 的变量,并将MySubFunction 设为nested 的MyMainFunction 函数。这样idx 将在两个函数之间共享,当您在脚本开头调用clear MyMainFunction 时,idx 将被清除。 @Hoki,我知道我可以使用嵌套函数,但为了可读性和舒适性,我更喜欢使用本地函数。我通常尽量避免嵌套函数。 @JSmith 嵌套函数是一个很棒的工具。它们和子函数一样可读,你绝对不应该剥夺自己使用语言提供的所有功能。一旦你使用它,你就会意识到它是多么的舒适。我的建议:敞开心扉去吧!【参考方案2】:

不幸的是,另一个答案部分不正确 - 不可能使用 clear MySubFunction 清除子函数中的持久变量。

引用an answer by a MathWorks staff member,

只能清除***或主要功能(与文件同名)。要清除任何本地或嵌套函数,必须清除 main 函数,并且在 main 函数(或文件中的任何其他函数)运行时不能这样做。

只能从内存中清除整个 m 个文件。整个文件作为一个单元进行管理,所以不清除主功能就无法清除子功能。

因此,您的选择是

将子函数分离到自己的m文件中,或者 从MainScript.m 中清除整个MyMainFunction,或 遵循 Ratbert 的第二个建议,即不要使用 clear,而是给 MySubFunction 一个额外的参数,告诉它自己重置持久变量

【讨论】:

以上是关于如何清除子函数中的持久变量的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB - 持久变量

如何在 MATLAB 方法中清除持久变量

如何清除ipython中的变量?

如何清除字符串流变量?

如何清除 NSManagedObjectContext 中的所有对象?

如何清除或删除 Julia 中的全局变量?