【发布时间】:2011-01-31 09:53:06
【问题描述】:
我在 MATLAB 中有一个对象数组,我在循环中调用了它们的构造函数:
antsNumber = 5;
for counter = 1: antsNumber
ant(counter) = TAnt(source, target);
end
MATLAB 警告我使用预分配来加快进程。我确实知道预分配的好处,但我不知道如何为对象做到这一点。
【问题讨论】:
我在 MATLAB 中有一个对象数组,我在循环中调用了它们的构造函数:
antsNumber = 5;
for counter = 1: antsNumber
ant(counter) = TAnt(source, target);
end
MATLAB 警告我使用预分配来加快进程。我确实知道预分配的好处,但我不知道如何为对象做到这一点。
【问题讨论】:
这里有几个选项,要求您为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
这将使您完全避免循环。
如果TAnt 是派生自handle class,上面的第一个选项应该可以正常工作,但第二个选项不会,因为它会给你5个句柄副本相同的对象而不是不同对象的5个句柄。
【讨论】:
TAnt 类的任何详细信息,我不得不猜测您的错误是由于您没有设计类构造函数来处理没有输入参数的情况。您必须这样做才能使这些解决方案发挥作用。见此链接:mathworks.com/access/helpdesk/help/techdoc/matlab_oop/…
以下链接可能会有所帮助:
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
【讨论】:
empty 方法的解决方案可能会起作用,因为它使 MATLAB 不再对您大喊预分配,但它并不是真正的预分配,因为它仍然是一个空 数组。请注意 Waleed 链接到的文档中的此语句,标题为“将值分配给空数组”下:“如果您对属性值进行分配,MATLAB 会调用 SimpleClass 构造函数以将数组增长到所需的大小。”注意grow这个词,表示数组在分配时会改变大小,这是预分配要避免的。
empty 并没有真正执行预分配。相反,您应该在 for 循环之前添加以下行:ant(antsNumber) = TAnt(source, target);,前提是您有一个 nargin=0 的默认构造函数(为 ant(1:antsNumber-1) 中的元素调用)
它给出的警告是多余的,除非你在做计算量大的东西,否则我会忽略它。
它给你错误的原因是它必须找到新的空间。比如说,我给你一个包含七个对象的列表,我告诉你你需要把它们都排成一排,然后我离开,给你一些你需要放在某个地方的东西。然后我给你第八个对象并告诉你把它放在第七个之后。因为你在第八个对象所在的位置有东西,所以你要么必须将它移开,要么必须移动所有七个对象。 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
【讨论】: