使用SuperClass时避免重复数据

时间:2013-04-15 12:02:31

标签: oop matlab pass-by-reference

我是第一次开发MATLAB OOP项目。我的父类将有一个非常大的矩阵,孩子(很多)需要访问。如何防止孩子复制数据?

在伪代码中我需要,

classdef parent
    properties
        largeMatrix;
    end
end
classdef child < parent
    methods
        function obj = child(parent)
             Data.parent of this child = Share from parent
        end
        ...
        something = largeMatrix(n,m);
    end
end
p = parent; p.largeMatrix = rand(100);
c1 = child(p);
c2 = child(p);

孩子c1和c2都应该访问原始rand(100)中创建的相同数据,但不应该复制largeMatrix,因为我需要很多孩子,并且希望程序具有内存效率。将从文件中读取largeMatrix

PS:这是我第一次在这个论坛上发帖,如果我发错了,请原谅我。

2 个答案:

答案 0 :(得分:2)

MATLAB 在写入时复制数组

假设你的parent类是(不需要子句句柄):

classdef parent
    properties
        largeMatrix;
    end
end 

并且您的child班级是:

classdef child < parent
    methods
        function obj = child(parent)
            obj.largeMatrix = parent.largeMatrix;
        end
    end
end

现在,让我们创建父级并为其属性largeMatrix分配一个大矩阵:

p = parent;
p.largeMatrix = rand(1e4); % 750 MB circa

检查内存中的跳转:

enter image description here

现在,让我们创建一个子节点并检查数据是否被引用:

c = child(p);
size(c.largeMatrix)

你可以看到内存没有跳跃:

enter image description here

最后,让我们对孩子的数据做一个简单的改变:

c.largeMatrix(1) = 1;

如您所见,只有写入数组才能被有效复制

enter image description here

为防止对child.largeMatrix进行写入,请在父类中使用属​​性(Abstract = true)和子(SetAccess = immutable)中定义属性。

答案 1 :(得分:1)

类只是一种数据类型,它不包含任何数据。如果您实例化parent类的对象Parent,然后child类的对象Child,则默认情况下child将不会继承任何数据来自parent。您可以使用复制构造函数将数据从一个对象复制到另一个对象。

child = parent;  % this copies the data in `parent` to `child`

但是,在这种情况下,Matlab会在parent中创建数据的副本。

您可以使用handle objects避免复制数据。您可以将句柄对象分配给多个变量或将其传递给函数,而不会导致MATLAB复制原始对象。例如,

classdef A < handle
    properties
        largeMatrix;  % wrap your large data into a handle class
    end
end

classdef B
    properties
        data;
    end
    methods
        function obj = B(mydata)
            obj.data = mydata;
        end
    end
end

然后在主程序中你可以分配

a = A();
a.largeMatrix = rand(100);
b1 = B(a);   
b2 = B(a);
b3 = b1;    % can even do this

% no copies of largeMatrix were made, because `a` is a handle object

% accessing largeMatrix
b1.data.largeMatrix 
b3.data.largeMatrix