Matlab:静态类成员

标签 matlab list class static

我正在尝试实现一个可以在 Matlab 中用作实例计数器的列表。我希望这个列表是静态的。

到目前为止,matlab 中还没有 static 关键字,但它们提供了一种几乎可以完成这项工作的模式:

声明一个继承句柄的类List:

classdef List < handle

   properties (Access = private)
      cellRepresentingAList = {};
   end

   ..... %Implement any functions

end

然后您可以通过以下方式使用它:

classdef MyClassUsingAList < handle

    properties (Constant, Access = private)
       myListOfStuff = List();
    end

    .....

 end

我们使用句柄对象作为常量的事实导致 MyClassUsingAList 的每个实例都将使用相同的对象句柄,也就是我有一个静态列表。

一切都工作得很好,直到我遇到异常。或者我使用“停止调试”按钮进行调试并停止调试,或者保存。此刻,该列表已清除。空。

这不是我可以投入生产的东西。

Matlab 提供了持久变量,它在函数中起到静态变量的作用,但不可能在类中使用它们(除非您在使用列表的每个方法中都使用关键字“持久”)。

有没有可靠的方法可以实现这个目标?

谢谢

最佳答案

使用 persistent 关键字,如所述 here 。 (你选择了第二种方法,我认为你需要的是这个)。如果发生类似您使用 mlock 命令描述的情况,您可以锁定函数,以免意外清除。

请注意,您不必必须按照您所说的在每个方法中定义持久变量! (事实上​​,这可能会产生与您想要的相反的效果,因为持久变量对于每个函数都是唯一的,而不是对于整个类来说是唯一的)。只需创建一个具有静态访问的单个方法,其全部目的是保留该持久变量的副本,并在需要获取或设置它的任何其他非静态方法中引用该方法。

例如

classdef myclass

  properties
    Prop1;
    Prop2;
  end

  methods(Static, Access='public')
    function Out = StaticVar1(In)   % first static "variable"
      mlock
      persistent var;
      if isempty(var); var = 0; end          % initial value
      if nargin < 1; Out = var; return; end  % get value
      var = In;                              % set value
    end
    function Out = StaticVar2(In)   % second static "variable"
      mlock
      persistent var;
      if isempty(var); var = 0; end          % initial value
      if nargin < 1; Out = var; return; end  % get value
      var = In;                              % set value
    end
  end

  methods
    function Out = addStaticVars(o)
      Out = o.StaticVar1 + o.StaticVar2;
    end
  end
end

使用示例:

>> a = myclass();
>> myclass.StaticVar1       % access the first static "variable"
ans =
     0
>> myclass.StaticVar2       % access the second static "variable"
ans =
     0
>> myclass.StaticVar1(10)   % set static "variable" to 10
>> myclass.StaticVar2(20)   % set static "variable" to 20
>> a.addStaticVars()        
ans =
    30
>> b = myclass();
>> b.addStaticVars()
ans =
    30

>> clear all;               % inneffective as functions are "locked"
>> myclass.StaticVar1
ans =
    10

>> munlock myclass.StaticVar1
>> clear all;        % this will now succeed in clearing the static "variable"
>> myclass.StaticVar1
ans =
     0

关于Matlab:静态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39171576/

相关文章:

C++ 组合,一个对象如何知道它所在的类?

java - Android 在 Class Object 中添加 ArrayList<Object> 作为变量

Matlab 未绘制精确的傅里叶信号

MATLAB 无法加载由 Dymola 创建的 MAT 文件

python - python中的列表索引比较

python - 如何合并列表中的相似项目

list - 将python中的单个有序列表转换为字典,pythonically

php - 在 php 中使用私有(private)构造函数扩展类与版本 5.1 到 5.4 不同

c++ - 写入时发生 fatal error LNK1168 : cannot open filename. mexw64

matlab - 如何调整 MATLAB 矩阵的大小