为对象数组预分配内存

时间:2018-01-25 17:03:21

标签: arrays matlab class memory pre-allocation

我有一个自定义的类ClassA,我想创建一个大小为N的空对象数组来存储N ClassA个对象。

现在我正在使用一个空的单元格数组cellarrayA = cell(N,1),并将每个对象放入单元格,如cellarrayA(n) = ClassA(input(n))。完成所有操作后,我使用objarrayA = [cellarrayA{:}]将单元格数组转换为对象数组。

它有效(Matlab没有抱怨),但我认为它实际上没有预先分配适量的内存,因为在创建对象之前,单元格数如何才能知道对象的大小?我的对象的大小可能相当大,大约1MB(但它可能会有所不同)。我猜我可能会遭受同样的性能损失,就好像我没有预先分配任何东西,尽管我无法验证它。那么我怎样才能预先分配对象数组,而不是使用单元格数组?

1 个答案:

答案 0 :(得分:0)

通常,这是我为了实现类数组“preallocation”而做的事情

1)我在我的类中定义了一个不接受输入参数的构造函数,如下所示:

classdef MyClass
   properties
      MyProperty
   end
   methods
      function obj = MyClass()
          % ...
      end
   end
end

2)我使用repmat function来实例化MyClass个实例的数组:

classes = repmat(MyClass(),10,1);

3)如有必要,我会使用正确的值循环初始化实例属性的数组:

A = [ ... ]; % 10-by-1 matrix with numerical values

for i = 1:numel(classes)
    classes(i).MyProperty = A(i);
end

如果可以使用相同的默认属性值初始化每个实例,我使用步骤2 中的方法调用能够正确分配它们的构造函数:

classes = repmat(MyClass('default_property_value'),10,1);

如果MyClass继承自handle类,则不应使用此方法:

classdef MyClass < handle
   % ...
end

否则进程将生成相同句柄的副本数组。此外,此方法不能用作真正的内存预分配过程,因为它通过一遍又一遍地复制该类的单个分配实例的副本来工作。当然,如果这是您主要担心的问题,这将使Matlab不再为缺少预分配而哭泣。而且肯定会重新调整一系列对象。