4

我是第一次开发 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:这是我第一次在这个论坛发帖,如果我发错了,请原谅我。

4

2 回答 2

2

MATLAB在 write 时复制数组

假设您的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

查看内存中的跳转:

在此处输入图像描述

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

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

如您所见,内存中没有跳转:

在此处输入图像描述

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

c.largeMatrix(1) = 1;

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

在此处输入图像描述

为了防止写入在child.largeMatrix具有属性的父类(Abstract = true)和子类中定义属性(SetAccess = immutable)

于 2013-04-15T16:50:38.780 回答
1

类只是一种数据类型,它不保存任何数据。如果你实例化一个类的对象parentParent然后实例化一个类的对象childChild那么默认情况下child不会从parent. 您可以使用复制构造函数将数据从一个对象复制到另一个对象。

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

但是,在这种情况下,Matlab 会在parent.

您可以通过使用句柄对象来避免复制数据。您可以将句柄对象分配给多个变量或将其传递给函数,而不会导致 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
于 2013-04-15T14:20:08.827 回答