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

时间:2015-09-09 07:46:34

标签: matlab

我有一个调用函数的脚本,该函数是在单独的文件中编写的,并且包含仅在main函数内部的子函数。在我的一个子函数中,我有持久变量,我想在每次运行主脚本时清除它。我怎么能这样做?另外,我的代码中有断点,我更愿意在清除持久变量时保留它们 - 如何做到这一点?

MainScript.m脚本:

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

MyMainFunction代码:

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”持久变量,但当然只要脚本运行就保留该变量。

谢谢,约翰

2 个答案:

答案 0 :(得分:3)

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

clear MySubFunction

而不是

clear variables;

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

如果您之前munlock使用了您的功能,则可以使用mlock

您可以在函数中定义一组专门用于清除持久变量的参数,并在主文件的开头用这种语法调用该函数。

答案 1 :(得分:0)

不幸的是,另一个答案是部分错误的 - 使用clear MySubFunction来清除子函数中的持久变量是 NOT

引用an answer by a MathWorks staff member

  

只能清除顶级或主要功能(与文件同名)。要清除任何本地或嵌套函数,必须清除main函数,并且在main函数(或文件中的任何其他函数)运行时无法完成。

  

只能从内存中清除整个m文件。整个文件作为一个单元进行管理,因此无需清除主函数就可以清除子函数。

因此,您的选择是

  • 将子功能分隔为自己的m文件,或
  • MyMainFunction
  • 中清除整个MainScript.m
  • 按照Ratbert的第二个建议,即不使用clear,而是给MySubFunction一个额外的参数,告诉它自己重置持久变量