Oop 使用超类时避免重复数据
我第一次开发了一个MatlabOOP项目。我的父类将有一个非常大的矩阵,子类(许多)需要访问它。如何防止孩子们复制数据 在伪代码中,我要求Oop 使用超类时避免重复数据,oop,matlab,pass-by-reference,Oop,Matlab,Pass By Reference,我第一次开发了一个MatlabOOP项目。我的父类将有一个非常大的矩阵,子类(许多)需要访问它。如何防止孩子们复制数据 在伪代码中,我要求 classdef parent properties largeMatrix; end end classdef child < parent methods function obj = child(parent) Data.parent of this child =
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);
classdef父级
性质
大基质;
结束
结束
classdef子级<父级
方法
函数obj=子函数(父函数)
此子项的Data.parent=来自父项的共享
结束
...
某物=大矩阵(n,m);
结束
结束
p=父母;p、 大矩阵=兰特(100);
c1=儿童(p);
c2=儿童(p);
子项c1和c2都应该访问在原始rand(100)
中创建的相同数据,但不应该复制largeMatrix
,因为我需要很多子项,并且希望程序具有内存效率。将从文件中读取largeMatrix
PS:这是我第一次在这个论坛上发帖,如果我发错了,请原谅。类只是一种数据类型,它不包含任何数据。如果实例化
父类的对象父类
,然后实例化子类的对象子类
,则默认情况下子类
不会从父类
继承任何数据。可以使用复制构造函数将数据从一个对象复制到另一个对象
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
MATLAB在写入时复制数组
假设您的父类是(无需将句柄子类化):
您的孩子
班级是:
classdef child < parent
methods
function obj = child(parent)
obj.largeMatrix = parent.largeMatrix;
end
end
end
查看内存中的跳转:
现在,让我们创建一个子项并检查数据是否被引用:
c = child(p);
size(c.largeMatrix)
如您所见,内存中没有跳转:
最后,让我们对孩子的数据做一个简单的更改:
c.largeMatrix(1) = 1;
如您所见,只有写入时才有效地复制数组
:
为了防止对child.largeMatrix
进行写入,请使用属性(Abstract=true)
在父类中定义属性,并在子类(SetAccess=immutable)
中定义属性,即使父类不处理,也不能简单地创建子类,从而复制数据。只有在修改子对象中的数据时,才会进行复制。
p = parent;
p.largeMatrix = rand(1e4); % 750 MB circa
c = child(p);
size(c.largeMatrix)
c.largeMatrix(1) = 1;