为了在Matlab中预分配内存,我想初始化我的对象数组。我该怎么做呢?

时间:2014-06-25 19:47:58

标签: arrays matlab object memory-management

我有一类被称为块的对象。目前,我正在使用for循环创建一个块数组,只需将它们添加到空数组

即可
blockArray=[];
for ii=1:Size   
    blockArray=[blockArray block(....)];      
end

为了预分配内存,如何使用虚拟值初始化块的对象数组?

例如,如果不是使用块对象而是使用数字,我可以使用零(1,Size)轻松预分配。是否有类似我能做的事情?

2 个答案:

答案 0 :(得分:5)

matlab文档描述

  

要预分配对象数组,请先分配数组的最后一个元素。 MATLAB®使用默认的DocArrayExample对象填充第一个到倒数第二个数组元素。

所以,要做到这一点,而不是从1:size迭代,这样做更简单...

blockArray = []
blockArray(size) = block(...)

答案 1 :(得分:1)

该语言并不真正支持这一点,存在多种解决方案(或解决方法)。

复制第一个实例

将第一个元素推入数组时,可以使用此元素填充整个数组以实现预分配。这可能看起来很糟糕,但它实际上是我所知道的最快的可能性。

for ii=1:S
    %assumption e is a scalar, otherwise the code is totally screwed
    e=block(....)
    if ii==1
       %to do preallocation, fill it with your first element
       blockArray(1:S)=e
    else
       blockArray(ii)=e
    end      
end

使用单元格数组

明显的简单解决方案,您可以将任何类放入字段

blockArray=cell(S,1);
for ii=1:S
    %assumption e is a scalar, otherwise the code is totally screwed
    e=block(....)
    blockArray{ii}=e
end

这个解决方案非常简单但比第一个慢。您还失去了一些无法用于单元格的功能

让您的类实现数组功能

classdef A
properties
    arg1
    out
end
methods
    function  obj = A(varargin)
        if nargin==0
            %null object constructor
        elseif strcmpi(varargin{1},'createarray')
            sz=varargin(2:end);
            %preallocate
            obj(sz{:})=A;
        else
            %standard constructor
            obj.arg1=varargin{1};
            obj.out=[1 2 3;];
        end
    end

end
end

没有输入参数的构造函数会创建一个“空”或“空”对象,这用于预分配,因此它应该为空。 第一个参数makearray的构造函数创建一个数组 否则应该调用构造函数。

用法:

%create an empty object
A
%create an array of size 2,3,4
A('createarray',2,3,4)
%use the standard constructor
A(2)

最大的缺点是你必须修改你的课程。从来没有测试过这个解决方案,但它应该接近第一个性能。