【问题标题】:Avoiding duplicating data when using SuperClass使用 SuperClass 时避免重复数据
【发布时间】:2013-04-07 12:54:31
【问题描述】:

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

【问题讨论】:

    标签: oop matlab pass-by-reference


    【解决方案1】:

    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)

    【讨论】:

      【解决方案2】:

      类只是一种数据类型,它不保存任何数据。如果实例化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
      

      【讨论】:

      • 即使父级不处理 MATLAB 复制数据,也不能简单地创建子级。仅当您修改子项中的数据时才会发生复制。
      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2013-04-19
      • 2016-04-17
      • 2012-12-14
      相关资源
      最近更新 更多