如何在MATLAB中预分配一个类数组?

Kam*_*ely 13 oop matlab

我在MATLAB中有一个对象数组,我在一个循环中调用它们的构造函数:

antsNumber  = 5;
for counter = 1: antsNumber
    ant(counter) = TAnt(source, target);
end
Run Code Online (Sandbox Code Playgroud)

MATLAB警告我使用预分配来加速该过程.我确实知道预分配的好处,但我不知道如何为对象做到这一点.

gno*_*ice 8

以下是一些选项,它们要求您设计类构造函数,TAnt以便它能够处理无输入参数的情况:

  • 您可以创建一个默认TAnt对象(通过调用没有输入参数的构造函数)并使用REPMAT复制它以在进入for循环之前初始化您的数组:

    ant = repmat(TAnt(),1,5);  %# Replicate the default object
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您可以循环遍历数组,用新的默认对象覆盖每个默认对象.

  • 如果您的TAnt对象都使用相同的数据进行初始化,并且它们不是句柄类派生的,则可以创建1个对象并使用REPMAT进行复制:

    ant = repmat(TAnt(source,target),1,5);  %# Replicate the object
    
    Run Code Online (Sandbox Code Playgroud)

    这样可以避免完全循环.

  • 如果TAnt 句柄类派生的,那么上面的第一个选项应该可以正常工作,但是第二个选项不会,因为它会为同一个对象提供5个句柄副本,而不是5个不同对象的句柄.


Wal*_*shi 6

以下链接可能有所帮助:

http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
死链接的网络存档

新链接:http:
//de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html

  • @Kamran:使用对象的`empty`方法的解决方案可能会起作用,因为它使得MATLAB不再向你大肆宣传预分配,但它并不是真正的预分配,因为它仍然是一个*empty*数组.请注意Waleed链接到的文档中的此语句,在"为空数组赋值"标题下:"如果对属性值进行赋值,MATLAB将调用SimpleClass构造函数以将数组增长到所​​需的大小." 注意单词**grow**,表示数组在分配时会改变大小,这是预分配要避免的. (7认同)
  • @Kamran:正如gnovice指出的那样,使用静态方法`empty`并不能真正执行预分配.相反,你应该在for循环之前添加以下行:`ant(antsNumber)= TAnt(source,target);`如果你有一个默认构造函数,其中nargin = 0(对于`ant(1:antsNumber)中的元素调用-1)`) (5认同)