Arrays 为了在Matlab中预先分配内存,我想初始化我的对象数组。我该怎么做?
我有一类称为块的对象。目前,我正在使用for循环创建一个块数组,只需将它们固定到一个空数组中Arrays 为了在Matlab中预先分配内存,我想初始化我的对象数组。我该怎么做?,arrays,matlab,object,memory-management,Arrays,Matlab,Object,Memory Management,我有一类称为块的对象。目前,我正在使用for循环创建一个块数组,只需将它们固定到一个空数组中 blockArray=[]; for ii=1:Size blockArray=[blockArray block(....)]; end 为了预先分配内存,我如何用虚拟值初始化块的对象数组 例如,如果我不使用块对象,而是使用数字,我可以通过使用零(1,Size)轻松地进行预分配。我能做些类似的事情吗?语言并不真正支持这一点,存在多种解决方案(或变通方法) 复制第一个实例 将
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
来测试输入的数量,并在没有提供输入的情况下提供默认值,来设计构造函数。我用这种方法尝试了这一点,但我得到了一个错误:从块转换为双块时出现了以下错误:无法使用双块转换为双块时出现错误。