如何在MATLAB类中获取静态成员变量?

Vah*_*agn 15 oop matlab class static-functions matlab-class

有没有办法在MATLAB类中定义静态成员变量?

这不起作用:

classdef A

    properties ( Static )
        m = 0;
    end
end
Run Code Online (Sandbox Code Playgroud)

它建议使用关键字"常量"而不是"静态",不能修改常量属性.我想要一个对所有类对象通用的变量A,我希望能够在类的方法中修改该变量A.

所以我需要的是一个私有静态成员变量.有没有办法在MATLAB中获得它?


发现可以使用静态成员函数中的持久变量来完成变通方法.

在这种情况下,您应该从基类继承所有类,如下所示.

classdef object < handle

    properties ( GetAccess = 'public', SetAccess = 'private' )
        id
    end

    methods ( Access = 'protected' )
        function obj = object()
            obj.id = object.increment();
        end
    end

    methods ( Static, Access = 'private' )
        function result = increment()
            persistent stamp;
            if isempty( stamp )
                stamp = 0;
            end
            stamp = stamp + uint32(1);
            result = stamp;
        end
    end  
end
Run Code Online (Sandbox Code Playgroud)

Mik*_*ail 16

你不能,它是设计的.你应该使用一个persistent变量(2011年应用于1980年的MATLAB技术)!

为了完整起见,我应该提一下,实际上2010b是一个未记录的,可能不再支持的static属性修饰符.

有关背景看这里的答案戴夫·福蒂 MATLAB OO组经理:

在MATLAB中,类可以定义常量属性,但不能定义其他语言(如C++)的"静态"属性.有些测试版本试用了"静态"属性,而未记录的属性则从那时开始.但是,静态属性未记录,不应使用,并且可能会在将来的MATLAB版本中删除.R2008a将其实现为Constant的同义词,并且除了Constant属性的记录行为之外,不提供任何其他功能.

不能从属性声明中指定的初始值更改常量属性.MATLAB的工作原理有几个原因.首先,MATLAB有长期规则,变量总是优先于函数和类的名称,并且赋值语句引入变量(如果尚不存在).因此,任何形式为"AB = C"的表达式都将引入一个新变量A,它是一个包含字段B的结构数组,其值为C.如果"AB = C"可以引用类A的静态属性,则类A将优先于变量A,这与MATLAB的先前版本非常重要.这意味着包含赋值语句"AB = C"的m文件可以通过在MATLAB路径上引入一个名为A的类来改变其含义.MATLAB程序员始终能够依赖赋值语句,这些语句引入的变量会影响同名的任何其他用法.

其次,我们观察到静态数据很少在其他类中使用,除了作为类中的私有数据或作为公共常量.例如,对几个Java类库的调查发现,所有公共静态字段也都是最终的.在MATLAB中,常量属性可以像Java中的"public final static"字段一样使用.对于类内部的数据,MATLAB已经具有可以在私有或受保护方法或类私有使用的本地函数内创建的持久变量.在可能的情况下,在MATLAB中避免静态数据也是有充分理由的.如果类具有静态数据,则可能难以在多个应用程序中使用相同的类,因为静态数据可能是应用程序之间冲突的来源.在一些其他语言中,这不是一个问题,因为不同的应用程序被单独编译成在具有不同类静态数据副本的不同进程中运行的可执行文件.在MATLAB中,经常有许多不同的应用程序可以在同一个进程和环境中运行,每个类只有一个副本.


Ben*_*Ben 11

这是在Matlab中创建静态属性的直接方法.这个实现与假设(但不可能;参见Mikhail的答案)真正的静态属性之间的唯一区别是设置成员变量的语法.

classdef StaticVarClass
    methods (Static = true)
        function val = staticVar(newval)
            persistent currentval;
            if nargin >= 1
                currentval = newval;
            end
            val = currentval;
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

现在可以通过以下方式读取静态属性staticVar:

StaticVarClass.staticVar
Run Code Online (Sandbox Code Playgroud)

......并通过以下方式设置:

StaticVarClass.staticVar(newval);
Run Code Online (Sandbox Code Playgroud)

因此,例如,这是此功能测试的预期输出:

>> StaticVarClass.staticVar
  ans =
      []
>> StaticVarClass.staticVar('foobar')
  ans =
      foobar
>> StaticVarClass.staticVar
  ans =
      foobar
>> 
Run Code Online (Sandbox Code Playgroud)

这种方法适用于您所请求的私有静态属性,但演示代码稍长一些.请注意,这不是句柄类(尽管它在句柄类上也能很好地工作).

classdef StaticVarClass
    methods (Access = private, Static = true)
        function val = staticVar(newval)
            persistent currentval;
            if nargin >= 1
                currentval = newval;
            end
            val = currentval;
        end
    end

    methods
        function this = setStatic(this, newval)
            StaticVarClass.staticVar(newval);
        end

        function v = getStatic(this)
            v = StaticVarClass.staticVar;
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

......和测试:

>> x = StaticVarClass
  x = 
      StaticVarClass with no properties.
      Methods
>> x.getStatic
  ans =
      []
>> x.setStatic('foobar')
  ans = 
      StaticVarClass with no properties.
      Methods
>> x.getStatic
  ans =
      foobar
>> 
Run Code Online (Sandbox Code Playgroud)