有没有一种方法可以编写一个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
请注意,我希望“东西”以某种方式存储为属性,因此当我保存实例时,我会知道所用方法的版本。
最好是公共属性,而不是静态属性。我想序列化实例。
答案 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
然后将baz
中foo.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
文件相对)的函数可能会更好地回答原始问题,所以我会接受这样的答案(如果已发布)。此解决方案足以满足我的目的。