我在 MATLAB 中有一个对象数组,并且我在循环中调用了它们的构造函数:
antsNumber = 5;
for counter = 1: antsNumber
ant(counter) = TAnt(source, target);
end
MATLAB 警告我使用预分配来加速该过程。我确实知道预分配的好处,但我不知道如何对对象执行此操作。
这里有一些选项,要求您为
TAnt
设计类构造函数,以便它能够处理 无输入参数情况:
您可以创建一个默认的
TAnt
对象(通过调用不带输入参数的构造函数)并使用 REPMAT 复制它以在进入 for 循环之前初始化数组:
ant = repmat(TAnt(),1,5); %# Replicate the default object
然后,您可以循环数组,用新对象覆盖每个默认对象。
如果您的
TAnt
对象都使用相同的数据进行初始化,并且它们不是派生自handle类,您可以创建1个对象并使用REPMAT来复制它:
ant = repmat(TAnt(source,target),1,5); %# Replicate the object
这将使您完全避免循环。
如果
TAnt
is 派生自 handle 类,则上面的第一个选项应该可以正常工作,但第二个选项则不行,因为它会为您提供 same 对象的句柄的 5 个副本,而不是5 个用于不同对象的句柄。以下链接可能会有所帮助:
http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
死链接的网络存档
新链接:
http://de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html
它给出的警告是多余的,除非你正在做计算量大的事情,否则我会忽略它。
它给你错误的原因是因为它必须找到新的空间。 比如说,我给你一个包含七个物品的清单,然后我告诉你你需要将它们全部排成一排,然后我走开,再给你一些你需要放在某个地方的东西。 然后我给你第八个对象,并告诉你把它放在第七个对象之后。 因为第八个物体所在的位置有东西,所以您要么必须将其移开,要么必须移动所有七个物体。 Matlab告诉你,如果你事先告诉它你想把5个东西放在那里,而不是把东西一件一件地交给它,每次都必须寻找一个新的位置,那么速度会更快。 您可以通过将此行添加到代码顶部来做到这一点:
ant = [1:5];
还有其他方法可以做到这一点。
不确定我是否正确解决了您的问题,但如果您想初始化自定义类“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
createArray
创建对象数组。
要使用 0 参数构造函数创建 1×
antsNumber
的 TAnt
数组,请编写:
ant = createArray(1, antsNumber, "TAnt");
如果您需要将参数传递给构造函数,就像在您的示例中一样,请编写:
ant = createArray(1, antsNumber, FillValue=TAnt(source, target));
大小参数在 MATLAB 中按通常方式解释:
createArray(n, "TAnt")
创建一个 n
逐n
数组,createArray(n, m, "TAnt")
或 createArray([n, m], "TAnt")
创建一个 n
逐m
数组,并且 createArray(dims, "TAnt")
创建大小为 dims
的多维数组。