我在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
对象都使用相同的数据进行初始化,并且它们不是从句柄类派生而来,则可以创建一个对象并使用REPMAT进行复制:
ant = repmat(TAnt(source,target),1,5); %# Replicate the object
这将使您完全避免循环。
如果 TAnt
是从句柄类派生的,则第一种选项应该可以正常工作,但第二个选项不会,因为它会为相同对象的5个副本提供一个句柄,而不是不同对象的5个句柄。
http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
无效链接的Web存档
新链接:
http://de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html
empty
方法的解决方法可能是有效的,因为它能使 MATLAB 不再警告你需要预分配,但这并不是真正的预分配,因为它仍然是一个 空 数组。请注意文档中 Waleed 提供的链接下的说明:“如果对属性值进行赋值, MATLAB 将调用 SimpleClass 构造函数将数组增长到所需大小。” 注意 增长 这个词,表明数组在被赋值时会改变大小,而这正是预分配所要避免的。 - gnoviceempty
并不能真正执行预分配。相反,在for循环之前,你应该添加以下代码行:ant(antsNumber) = TAnt(source, target);
,前提是你有一个默认构造函数,并且nargin=0(这将用于ant(1:antsNumber-1)
中的元素)。 - Amro它给出的警告是多余的,除非你在进行计算密集型的操作,否则我会忽略它。
它给你错误的原因是因为它需要找到新的空间。比如说,我给你七个物品的列表,并告诉你需要把它们都排成一行,然后我离开了,给你更多需要放置的东西。然后我给你第八个物品,并告诉你将其放在第七个物品之后。因为第八个物品的位置已经有东西了,你要么必须将其移开,要么必须移动所有七个物品。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