matlab中的oop范例创建了多少开销

时间:2014-01-26 14:04:06

标签: matlab oop matlab-class

在matlab中,每个类方法看起来都像一个普通方法,其第一个参数是对象本身。

这样的范例对于其他oop语言(例如python)是完全可以接受的,因为类是通过引用传递的。另一方面,matlab默认按值传递对象(句柄类除外)。

从所有这些中我推断,使用最简单的setter函数(或任何其他类方法)将导致整个对象被复制。

例如,这是matlab中某些类方法的签名:

classdef foo
  methods
    function obj = set.myParam(obj,value);
    function myfun(obj, value);
  end
end

在这种情况下,当我调用fooObj.myfun(5)(或者只是myfun(fooObj,5))时,matlab会复制整个fooObj = foo()吗?

这不是一个非常大的开销吗?复制每个类方法(和setter)的整个对象在我看来效率极低。

我错过了什么吗?反正是在使用oop技术的同时避免matlab中的这种情况吗?

我是否必须使用句柄类来防止此类性能开销?

1 个答案:

答案 0 :(得分:3)

如果你希望你的类具有引用语义,那么是的,你需要使用句柄类而不是值类。

但请注意,虽然默认情况下MATLAB按值传递参数,但它也使用延迟复制复制写入,因此只有输入参数才能复制。输入参数需要修改。此外,如果输入参数是结构或对象,则副本仅由需要修改的部分(字段,属性)组成。

此外,MATLAB还有一个就地优化,如果输出参数与输入参数相同,则输入参数的操作可以在中完成-place ,然后无需复制。

因此,例如,考虑这个函数:

function y = timestwo(x)
y = 2*x;

如果您从基础工作区中的变量a开始(假设它是一个非常大的双精度数组)并调用b = timestwo(a),则不会复制a,因为在函数期间未修改x。仅在分配输出参数y时才会增加内存使用量。

但请考虑这个功能:

function y = timestwoconj(x)
x = x';
y = 2*x;

现在,在函数执行期间内存使用量增加,因为在修改时由x复制。在计算y时分配相同的空间,然后在函数退出x的临时副本时清除。

这说明了写行为的副本。

还要考虑以下功能:

function x = timestwo(x)
x = 2*x;

这里输出参数与输入参数相同,所有操作都可以就地完成。如果您致电a = timestwo(a),则根本不会复制,内存使用量也不会增加。这说明了优化的就地行为。

尝试实现类似于上面的一些函数,将它们应用到一个大数组,然后在调试器中逐行逐步执行它们,同时在任务管理器中查看内存使用情况 - 你会明白这一点。

在MATLAB中实现值类时,通常会使用function obj = myfun(obj, value)等方法的语法,而不是function myfun(obj, value)。方法具有与上述相同的工作方式,因此只有在方法期间修改对象时才会复制对象。

当您使用值类时,这就是您想要发生的事情 - 如果您想要引用语义,请使用句柄类。

希望有所帮助!