我有一个自定义的类ClassA
,我想创建一个大小为N
的空对象数组来存储N
ClassA
个对象。
现在我正在使用一个空的单元格数组cellarrayA = cell(N,1)
,并将每个对象放入单元格,如cellarrayA(n) = ClassA(input(n))
。完成所有操作后,我使用objarrayA = [cellarrayA{:}]
将单元格数组转换为对象数组。
它有效(Matlab没有抱怨),但我认为它实际上没有预先分配适量的内存,因为在创建对象之前,单元格数如何才能知道对象的大小?我的对象的大小可能相当大,大约1MB(但它可能会有所不同)。我猜我可能会遭受同样的性能损失,就好像我没有预先分配任何东西,尽管我无法验证它。那么我怎样才能预先分配对象数组,而不是使用单元格数组?
答案 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不再为缺少预分配而哭泣。而且肯定会重新调整一系列对象。