2013-04-15 2 views
4

Я разрабатываю проект MATLAB OOP в первый раз. Мой родительский класс будет иметь очень большую матрицу, к которой дети (многие) должны иметь доступ. Как я могу запретить детям копировать данные?Избегание дублирования данных при использовании SuperClass

В псевдокоде я требую, чтобы,

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: Это первый раз, когда я публикую этот форум, поэтому простите меня, если я разместил его неправильно.

ответ

1

Класс - это всего лишь тип данных, он не содержит данных. Если вы создаете объект parent класса Parent, а затем объект child класса Child, то по умолчанию child не наследует никаких данных от parent. Вы можете скопировать данные из одного объекта в другой с помощью конструктора копирования.

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

Однако в этом случае Matlab создает копию данных в parent.

Вы можете избежать копирования данных с помощью handle objects. Вы можете назначить объект handle нескольким переменным или передать его функциям, не заставляя 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 
+0

Неверно, что просто создав дочерний элемент, даже если родитель не справляется с тем, что MATLAB копирует данные. Копия происходит только в том случае, если вы изменяете данные внутри дочернего элемента. – Oleg

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).

Смежные вопросы