我是第一次开发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:这是我第一次在这个论坛上发帖,如果我发错了,请原谅我。
答案 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
检查内存中的跳转:
现在,让我们创建一个子节点并检查数据是否被引用:
c = child(p);
size(c.largeMatrix)
你可以看到内存没有跳跃:
最后,让我们对孩子的数据做一个简单的改变:
c.largeMatrix(1) = 1;
如您所见,只有写入数组才能被有效复制:
为防止对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