Matlab方法作为属性

时间:2019-05-22 07:43:59

标签: matlab object methods

有没有一种方法可以编写一个Matlab类,该类具有自己的方法之一作为属性?我正在编写模拟代码,该类的方法(实际上是一个物理方程式)在将来的开发中可能会发生变化,因此我希望已归档的类实例包括该方法。

这是一些Matlab式的伪代码。

classdef foo
   properties
      bar % some property
      baz % a property that contains the method baz
   end
   methods
       function out = baz() % the method I want to store
          stuff
       end
   end
end

请注意,我希望“东西”以某种方式存储为属性,因此当我保存实例时,我会知道所用方法的版本。

最好是公共属性,而不是静态属性。我想序列化实例。

3 个答案:

答案 0 :(得分:2)

如果函数是单个表达式,则可以使用匿名函数。 It will be saved to a MAT-file(感谢gnovice指出这一点)。例如:

classdef foo
   properties
      bar = 0
      baz = @(x)sqrt(x)
   end
end

现在我可以这样做:

f = foo;
f.baz(2)  % returns 1.4142
save foo_test f
clear

然后将bazfoo.m的定义更改为baz = @(x)x.^2,然后:

f2 = foo;
f2.baz(2) % returns 4
load foo_test
f.baz(2)  % still returns 1.4142
f2.baz(2) % still returns 4

如果您具有更复杂的功能,则可以通过以下方式进行设置:

classdef foo
   properties
      bar = 5
      baz_func = @(obj,x) baz_2019_05_22(obj,x) % could be private
   end
   methods
      function out = baz(obj,x)
         out = obj.baz_func(obj,x);
      end
      function out = baz_2019_05_22(obj,x) % could be private
         out = obj.bar * sqrt(x);
      end
   end
end

现在:

f = foo;
f.baz(2) % returns 7.0711
save foo_test f
clear

将来您将更改函数,但是您保留了代码并创建了一个用于执行计算的新(私有)函数:

classdef foo
   properties
      bar = 5
      baz_func = @(obj,x) baz_2022_08_04(obj,x) % could be private
   end
   methods
      function out = baz(obj,x)
         out = obj.baz_func(obj,x);
      end
      function out = baz_2019_05_22(obj,x) % could be private
         out = obj.bar * sqrt(x);
      end
      function out = baz_2022_08_04(obj,x) % could be private
         out = obj.bar * x.^2;
      end
   end
end

这里的困难是保留旧代码而不更改它。但是您可以在这里使baz函数变得非常复杂。现在:

f2 = foo;
f2.baz(2) % returns 20
load foo_test
f.baz(2)  % still returns 7.0711

答案 1 :(得分:1)

classdef foo
    properties (Dependent, SetAccess = 'private')
        baz % a property that contains the method baz
    end
    methods
       function out = bazMethod() % the method I want to store
          stuff
       end

       function bazOut = get.baz(self)
           bazOut = bazMethod();
       end
    end

end

它不会序列化当前方法定义bazMethod,但是如果您只是想要的定义,那听起来像是想要baz成为Dependent属性。

答案 2 :(得分:1)

根据Dev-iL的评论和Cris的回答,这就是我所做的工作,它将整个classdef文件作为纯文本存储在属性class_definition中。

classdef foo
   properties
      class_definition
   end
   methods
       function obj = foo()
         obj.class_definition = fileread([mfilename(),'.m']);
       end
       function out = baz() % the method I want to store
          stuff
       end
   end
end

正如Dev-iL建议的那样,编写一个接受文件名和函数/方法句柄并以纯文本形式返回该函数的代码(与整个classdef文件相对)的函数可能会更好地回答原始问题,所以我会接受这样的答案(如果已发布)。此解决方案足以满足我的目的。