matlab:将句柄类复制为值类

Posted

技术标签:

【中文标题】matlab:将句柄类复制为值类【英文标题】:matlab: copy handle class as value class 【发布时间】:2015-08-24 20:55:54 【问题描述】:

当将此类的对象分配给变量时,是否可以使 Matlab 调用我的类 TMyClasscopy 方法(这是 handle calss)。换句话说,我希望我的handle 类在复制它时表现得像一个值类:

obj = TMyClass(); %// has method "copy", which returns a deep copy of the object
%// Now, if I write this ...
obj_copy = obj;   
%// ... I want Matlab to do in fact this:
obj_copy = obj.copy; %// 

据我了解,没有办法覆盖 Matlab 中的 = 运算符。是否有任何其他解决方法可以这样做?

谢谢!

【问题讨论】:

(因为我不确定这是否可行,)这种期望行为的预期用例或原因是什么?除了父母强制之外,可能还有其他解决问题的方法。 问题背景如下。我有一个描述一些数据的结构,许多函数处理这个结构。现在我想编写一个类(而不是结构)来存储和操作该数据,它应该是dynamicprops 类的后代。但我真的不想修改所有函数(兼容性问题),它们与结构一起工作并假设按值复制语义。 明白了。还有两个问题。 (1) 函数是否需要对其本地结构进行一些破坏性更改? (2)handle类的需求来自TMyClassdynamicprops的继承;有没有办法避免这种情况(如果您需要通过addprop 向其他知道TMyClass 的性质的类/函数中的实例添加属性,我只能看到需要该父级)? (1) 是的,像MyStruct.field = some_value 这样的函数中有很多操作,它假设MyStruct 是作为参数传递的原始函数的副本。 (2) 实际上,由于需要动态添加/删除属性,因此需要从dynamicprops 继承。问题是我希望所有功能也可以使用旧结构。到目前为止,我遇到的最简单的解决方案是为每个函数添加一个检查:如果参数是一个对象,则创建它的副本。但也许有更优雅的解决方案...... 【参考方案1】:

如果你有一个值类,那么obj_copy = obj 会为你的对象创建一个新副本。对于句柄类,您始终必须自己调用复制函数。 我已经遇到了同样的问题,建议您按照您的建议执行copy 方法。

根据你的设计和你想用它做什么,你也可以疯狂地使用流畅的界面。在我的情况下,我有一个包含数据的对象,它以这种方式返回自身的过滤副本:

obj = DataObject()
f1 = obj.getByType('pressure') % f1 ~= obj
f2 = f1.getByTemperature(@(x) x < 10) % using an anonymous function for filtering, also f2 ~= f1

【讨论】:

以上是关于matlab:将句柄类复制为值类的主要内容,如果未能解决你的问题,请参考以下文章

类句柄。 MATLAB

循环中重新分配的句柄类的 Matlab 代码生成

Matlab保存句柄实例不保存其属性值

MATLAB 的函数句柄

如何在matlab中将句柄对象层次结构保存到磁盘

在 MATLAB 中存储 imline 生成的对象的句柄