matlab - 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
请注意,我希望“东西”以某种方式存储为属性,因此当我保存实例时,我会知道我使用的方法的版本。
最好它是公共的,而不是静态属性。我想序列化实例。
解决方案
如果您的函数是单个表达式,则可以使用匿名函数。它将被保存到一个 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.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
推荐阅读
- c# - 如何在 C# 中创建不同的 Json
- python - 在 QLineEdit 和 QComboBox 中以编程方式撤消和重做
- android-studio - 如何在 kotlin 的 if 语句中更改按钮的不透明度
- php - 将新记录 id 插入到 url
- mysql - 如何使用示例数据在 Kubernetes 中启动 mysql 容器?
- php - mysqli_query 有问题,返回 NULL 但查询在 phpmyadmin 中有效
- arrays - ES5 Javascript:从 2 个选择器中获取唯一值并添加/更新到数组
- python - 使用 dask 将 ufunc 应用于 xarray 单个数据集变量作为延迟操作
- python - 如何在 keras 中使用有序分类列(“无法将字符串转换为浮点数:'CATEGORY'”)
- java - 使用 RxJava 将数据从 ViewModel 移动到 Fragment