我在MATLAB中有一个对象数组,我在一个循环中调用它们的构造函数:
antsNumber = 5;
for counter = 1: antsNumber
ant(counter) = TAnt(source, target);
end
MATLAB警告我使用预分配来加速这个过程。我确实知道预分配的好处,但我不知道如何为对象做到这一点。
答案 0 :(得分:7)
以下是一些选项,要求您为TAnt
设计类构造函数,以便它能够处理no input argument case:
您可以创建一个默认的TAnt
对象(通过调用没有输入参数的构造函数)并使用REPMAT复制它以在进入for循环之前初始化您的数组:
ant = repmat(TAnt(),1,5); %# Replicate the default object
然后,您可以遍历数组,用新的默认对象覆盖每个默认对象。
如果您的TAnt
个对象都使用相同的数据进行初始化,并且不是从handle class派生的,则可以创建1个对象并使用REPMAT复制它:
ant = repmat(TAnt(source,target),1,5); %# Replicate the object
这样可以避免完全循环。
如果从handle class派生TAnt
,则上面的第一个选项应该可以正常工作,但第二个选项不会,因为它会给你5个副本相同对象的句柄,而不是不同对象的5个句柄。
答案 1 :(得分:5)
以下链接可能有所帮助:
http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
Web archive of dead link
新链接:
http://de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html
答案 2 :(得分:1)
它给出的警告是多余的,除非你做的是计算繁重的东西,否则我会忽略它。
它给你错误的原因是因为它必须找到新的空间。说,我给你一个七个对象的列表,我告诉你,你需要将它们全部放在一排,然后我会离开,并给你一些你需要放在某处的东西。然后我给你第八个对象并告诉你在第七个之后把它放好。因为你有第八个对象的东西,你要么必须移开它,要么你必须移动所有七个对象。 Matlab告诉你,如果你事先告诉它你要在其中放置5件东西,而不是一个一个地给它一个东西,每次都要寻找一个新的位置,它会更快。您可以通过将此行添加到代码顶部来实现:
ant = [1:5];
还有其他方法可以做到这一点。
答案 3 :(得分:0)
不确定我的问题是否正确,但如果您想初始化自定义类“TAnt”的数组,请按以下步骤操作
function obj = TAnt(source, target)
if nargin > 0
obj.mySource = source;
obj.myTarget = target;
else
obj.mySource = defaultValue;
obj.myTarget = defaultValue;
end
end
然后初始化/预分配一组默认的TAnt对象,
ants(1,n) = TAnt(); % n is the length of your ants array