【问题标题】:Is it possible to share data between MATLAB objects, for example a look-up table?是否可以在 MATLAB 对象之间共享数据,例如查找表?
【发布时间】:2014-02-05 05:19:27
【问题描述】:

我在 MATLAB 中编写了一个句柄类,其中我通过 function obj = mtimes(a,b) 重载了“*”运算符,其中 ab 应该是该类的对象。我的问题如下。在函数mtimes 中,我需要访问一些“外部”数据,特别是我在代码一开始计算的查找表(LUT),所以这个LUT 应该以某种方式可用于所有对象那堂课。我当然可以在类定义中创建一个属性并使用该 LUT 初始化每个对象,但这不切实际,因为表非常大并且会被复制到每个对象?一般来说,我对 OOP 不是很熟悉,因此非常感谢任何有关如何解决此问题的建议。谢谢!

【问题讨论】:

  • 我假设您的意思是“*”运算符,而不是“+”运算符。
  • 对不起,我的错误。应该是“*”。

标签: matlab oop


【解决方案1】:

如果您说有一个所有对象都使用的通用、不变的 LUT,您可以将其设为常量属性。这样只会在第一次引用该类时计算它。

【讨论】:

  • 我认为 OP 可能正在使用“复制”来引用类的每个实例对象。你是说如果创建一个类的多个实例,每个实例都有一个常量属性,那么只有一个版本的数据会驻留在内存中的某个位置?
  • @horchler 是的。常量属性是最完整意义上的“常量”。你甚至不需要类的实例来访问它们,只需要类名ClassName.PropertyName
  • 谢谢。可以在此处找到有关properties with constant values 的一些详细信息。
  • @Matt:后续的小问题。在properties (constant) 块中,如何调用属于该类的方法?我可以通过classname.variablename 引用其他常量,但classname.functionname() 不起作用。
  • 如果方法是静态的,你可以调用类方法来实例化一个常量属性。
【解决方案2】:

您还可以在构造函数中将 LUT 设为持久变量,如下所示。这将为您提供更改对象构造表的灵活性。但是,在更改表之前,您应该小心发出clear classes

classdef myclass < handle

  properties

   LUT

  end  


  methods

   function obj=myclass(newtable)

     persistent LUT

     if isempty(LUT) && nargin

      LUT=newtable;

     elseif nargin

      warning 'Clear all previous objects'

      LUT=newtable;

     end


    obj.LUT=LUT;

   end

 end

end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2015-07-13
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多