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

Arrays 为了在Matlab中预先分配内存,我想初始化我的对象数组。我该怎么做?,arrays,matlab,object,memory-management,Arrays,Matlab,Object,Memory Management,我有一类称为块的对象。目前,我正在使用for循环创建一个块数组,只需将它们固定到一个空数组中 blockArray=[]; for ii=1:Size blockArray=[blockArray block(....)]; end 为了预先分配内存,我如何用虚拟值初始化块的对象数组 例如,如果我不使用块对象,而是使用数字,我可以通过使用零(1,Size)轻松地进行预分配。我能做些类似的事情吗?语言并不真正支持这一点,存在多种解决方案(或变通方法) 复制第一个实例 将

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

blockArray=[];
for ii=1:Size   
    blockArray=[blockArray block(....)];      
end
为了预先分配内存,我如何用虚拟值初始化块的对象数组


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

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

复制第一个实例

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

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)

最大的缺点是你必须修改你的类。从未测试过此解决方案,但其性能应接近第一。

matlab文档描述

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

因此,要做到这一点,与其从
1:size
进行迭代,不如简单一些

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

请注意,要做到这一点,类的构造函数需要支持具有零输入参数的语法,MATLAB将调用该语法来填充前n-1个元素。因此,通过使用
nargin
来测试输入的数量,并在没有提供输入的情况下提供默认值,来设计构造函数。我用这种方法尝试了这一点,但我得到了一个错误:从块转换为双块时出现了以下错误:无法使用双块转换为双块时出现错误。