【问题标题】: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”持久变量,但当然要在脚本运行期间保留该变量。

谢谢,约翰

【问题讨论】:

    标签: matlab


    【解决方案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 设为nestedMyMainFunction 函数。这样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 一个额外的参数,告诉它自己重置持久变量

    【讨论】:

      猜你喜欢
      • 2019-12-21
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2011-01-31
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多