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

时间:2010-03-24 18:33:42

标签: oop matlab

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

antsNumber  = 5;
for counter = 1: antsNumber
    ant(counter) = TAnt(source, target);
end

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

4 个答案:

答案 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”的数组,请按以下步骤操作

  1. 对于TAnt的构造方法,请输入类似:
  2. 的内容

    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