我有一类被称为块的对象。目前,我正在使用for循环创建一个块数组,只需将它们添加到空数组
即可blockArray=[];
for ii=1:Size
blockArray=[blockArray block(....)];
end
为了预分配内存,如何使用虚拟值初始化块的对象数组?
例如,如果不是使用块对象而是使用数字,我可以使用零(1,Size)轻松预分配。是否有类似我能做的事情?
答案 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)
最大的缺点是你必须修改你的课程。从来没有测试过这个解决方案,但它应该接近第一个性能。