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

Posted

技术标签:

【中文标题】如何在 MATLAB 方法中清除持久变量【英文标题】:How to clear a persistent variable in a MATLAB method 【发布时间】:2012-05-27 23:11:48 【问题描述】:

我有一个 MATLAB 类,其中包含一个使用持久变量的方法。当满足某些条件时,我需要清除持久变量而不清除方法所属的对象。我已经能够做到这一点,但只能通过使用 clear functions 来实现,这对于我的目的来说范围过于广泛。

这个问题的 classdef .m 文件:

classdef testMe

    properties
        keepMe
    end

    methods
        function obj = hasPersistent(obj)
            persistent foo

            if isempty(foo)
                foo = 1;
                disp(['set foo: ' num2str(foo)]);
                return
            end
            foo = foo + 1;
            disp(['increment foo: ' num2str(foo)]);

        end

        function obj = resetFoo(obj)
            %%%%%%%%%%%%%%%%%%%%%%%%%
            % this is unacceptably broad
            clear functions
            %%%%%%%%%%%%%%%%%%%%%%%%%
            obj = obj.hasPersistent;
        end
    end

end

使用此类的脚本:

test = testMe();
test.keepMe = 'Don''t clear me bro';

test = test.hasPersistent;
test = test.hasPersistent;
test = test.hasPersistent;

%% Need to clear the persistent variable foo without clearing test.keepMe

test = test.resetFoo;

%%
test = test.hasPersistent;
test

由此产生的输出是:

>> testFooClear
set foo: 1
increment foo: 2
increment foo: 3
increment foo: 4
set foo: 1

test = 

  testMe

  Properties:
    keepMe: 'Don't clear me bro'

  Methods

这是所需的输出。问题是classdef文件中的clear functions行清除了内存中的所有函数。我需要一种在更小的范围内清除的方法。例如,如果hasPersistent' was a function instead of a method, the appropriately scoped clear statement would beclear hasPersistent`。

我知道clear obj.hasPersistentclear testMe.hasPersistent 都无法清除持久变量。 clear obj 同样是个坏主意。

【问题讨论】:

您是否试图模拟 C++/Java 意义上的“静态属性”(类的属性而不是类实例)? 我不这么认为,虽然我的 C++/Java 很弱,所以有可能是我,但这不是我的本意。我不这么认为的原因是持久变量foo 在类的实例中不是恒定的。我需要它位于对象实例的本地,并且只需要在函数 hasPersistent 内部。 要理解我的意思,创建类test2 = testMe(); 的另一个实例并调用test2.hasPersistent... 这两个实例共享相同的持久变量foo。如果您不想要这种行为,为什么不使用常规属性(如keepMe 属性)并将其设为private 谢谢。我没有意识到这是工作区中有多个 testMe 对象的行为。您使用私有属性的建议是完全正确的,对我来说应该是显而易见的。这可能意味着是时候停下来过夜并上床睡觉了。如果您发布“改用私有财产”的答案,我会选择并投票。谢谢! 【参考方案1】:

根据 cmets 中的讨论,我认为您想使用将 foo 设为私有属性,并附带适当的 increment/reset 公共函数。

【讨论】:

【参考方案2】:

您绝对不需要持久变量来实现您想要的。但是,无论如何,要从类方法中删除持久变量,您必须 clear 相应的类。在你的情况下,clear testMe 应该做你想做的事。

一个相关的问题是如何清除包函数中的持久变量。要从 foo 包内的函数 foo_pkg 中删除持久变量 myVar,您必须这样做:

clear +foo_pkg/foo

只要文件夹 +foo_pkg 的父文件夹位于 MATLAB 路径中,这应该可以工作。

【讨论】:

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

MATLAB - 持久变量

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

Matlab中持久变量的初始化

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

如何删除 NumPy/SciPy 中的一些变量?

在 MATLAB 中,是不是可以重新定义 `clear` 以清除命令窗口,而不是清除存储的变量?