首页 > 解决方案 > Matlab方法作为属性

问题描述

有没有办法编写一个具有自己的方法之一作为属性的 Matlab 类?我正在编写模拟代码,其中类的方法(实际上是一个物理方程)可能会在未来的发展中发生变化,所以我希望存档的类实例包含该方法。

这是一些 Matlab-ish 伪代码。

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

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

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

标签: matlabobjectmethods

解决方案


如果您的函数是单个表达式,则可以使用匿名函数。它将被保存到一个 MAT 文件中(感谢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

baz然后将in的定义更改foo.mbaz = @(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

推荐阅读