【问题标题】:Matlab: How to clear persistent variable in a static method of a classMatlab:如何在类的静态方法中清除持久变量
【发布时间】:2018-10-22 22:33:11
【问题描述】:

我在静态方法中有一个带有持久变量的类。出于测试目的,我想清除它。 clear 的 Matlab 文档指出:

要清除特定类,请使用 clear myClass。

这个方向在How to clear a persistent variable in a MATLAB method中给出

但是,这对我不起作用。这是该问题的一个简单示例。当使用单个参数调用该方法时,该参数被假定为要存储在持久变量中的矩阵。当使用两个参数调用函数时,这些参数被假定为存储矩阵的索引引用。

class def 文件,exampleClass2.m,位于目录 @exampleClass2

classdef exampleClass2
    methods (Static=true)
        out = foo(varargin)
    end
end

foo.m,位于目录@exampleClass2

function out = foo(varargin)
    persistent persistMat;
    switch nargin
        case 1
            assert (ndims(varargin{1}) == 2)
            persistMat = varargin{1};
        case 2
            out = persistMat(varargin{1},varargin{2});
    end
end

和一个测试脚本

exampleClass2.foo(magic(5));
exampleClass2.foo(2,3)

ans = 7

clear exampleClass2
exampleClass2.foo(2,3)

ans = 7

清除这个持久变量应该怎么做,为什么清除类也不清除持久变量?

【问题讨论】:

  • 您的问题的简单答案是exampleClass2.foo([])。 :)

标签: matlab


【解决方案1】:

为什么清除类名不起作用

通常的clear className 没有清除持久变量的原因是该方法是在不同的 .m 文件中定义的,正如在 class def 文件中包含方法定义时所证明的那样。

classdef exampleClass3
    methods (Static=true)
        function out = foo(varargin)
            persistent persistMat;
            switch nargin
                case 1
                    assert (ndims(varargin{1}) == 2)
                    persistMat = varargin{1};
                case 2
                    out = persistMat(varargin{1},varargin{2});
            end
        end
    end
end

现在测试一下

exampleClass3.foo(magic(5));
exampleClass3.foo(2,3)

ans = 7

clear exampleClass3
exampleClass3.foo(2,3)

索引超出矩阵维度。

方法在单独的.m文件中时如何清除

要在方法定义在单独的 .m 文件中时清除静态方法的持久变量,请使用 clear methodName。例如,使用问题中的定义:

exampleClass2.foo(magic(5));
exampleClass2.foo(2,3)

ans = 7

clear foo
exampleClass2.foo(2,3)

索引超出矩阵维度。

如果路径包含一个单独的函数foo,或者其他类存在foo 方法怎么办?

很遗憾,clear exampleClass2.foo 不起作用:

exampleClass2.foo(magic(5))
clear exampleClass2.foo
exampleClass2.foo(2,3)

ans = 7

所以如果路径中包含函数foo,或者其他类有foo方法,那么所有此类函数/方法的持久变量都会被清除。

【讨论】:

  • 如果foo 被重载,它也存在于其他类或作为常规函数,clear foo 是否会清除foo 的所有实例?我真的不确定这一点。我想有可能做到clear exampleClass2.foo
  • @CrisLuengo 由于调用静态方法必须包含类名(例如exampleClass2.foo),而且一个类不能有多个定义一个方法,我觉得没有重载可能会造成任何混乱。我更新了答案以解决您提到的其他情况。
  • 感谢您的调查!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多