【问题标题】:How to preallocate an array of class in MATLAB?如何在 MATLAB 中预分配一个类数组?
【发布时间】:2011-01-31 09:53:06
【问题描述】:

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

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

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

【问题讨论】:

标签: oop matlab


【解决方案1】:

这里有几个选项,要求您为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个句柄。

【讨论】:

  • 它实际上可以工作,但在此之前它应该修改为 ant = repmat(TAnt(source,target),0,5)
  • @Kamran:这会给你一个空数组(0×5)。对于预分配,您确实希望创建一个与您最终得到的 大小相同的默认数组 (1×5)。
  • 看起来是这样,但“(0,5)”有效!当我尝试使用 (1,5) 时会导致错误。
  • 它们都不起作用...它说:表达式或语句不完整或不正确。
  • @Kamran:由于您没有提供有关 TAnt 类的任何详细信息,我不得不猜测您的错误是由于您没有设计类构造函数来处理没有输入参数的情况。您必须这样做才能使这些解决方案发挥作用。见此链接:mathworks.com/access/helpdesk/help/techdoc/matlab_oop/…
【解决方案2】:

以下链接可能会有所帮助:

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

【讨论】:

  • 谢谢,它很有帮助。我添加了 ant = TAnt.empty(antsNumber,0) 并且有效!
  • 根据链接,答案是ant = TAnt.empty(antsNumber, 0)
  • @Kamran:您使用对象的empty 方法的解决方案可能会起作用,因为它使 MATLAB 不再对您大喊预分配,但它并不是真正的预分配,因为它仍然是一个 数组。请注意 Waleed 链接到的文档中的此语句,标题为“将值分配给空数组”下:“如果您对属性值进行分配,MATLAB 会调用 SimpleClass 构造函数以将数组增长到所​​需的大小。”注意grow这个词,表示数组在分配时会改变大小,这是预分配要避免的。
  • @Kamran:正如 gnovice 所指出的,使用静态方法 empty 并没有真正执行预分配。相反,您应该在 for 循环之前添加以下行:ant(antsNumber) = TAnt(source, target);,前提是您有一个 nargin=0 的默认构造函数(为 ant(1:antsNumber-1) 中的元素调用)
【解决方案3】:

它给出的警告是多余的,除非你在做计算量大的东西,否则我会忽略它。

它给你错误的原因是它必须找到新的空间。比如说,我给你一个包含七个对象的列表,我告诉你你需要把它们都排成一排,然后我离开,给你一些你需要放在某个地方的东西。然后我给你第八个对象并告诉你把它放在第七个之后。因为你在第八个对象所在的位置有东西,所以你要么必须将它移开,要么必须移动所有七个对象。 Matlab 告诉你,如果你事先告诉它你想在里面放 5 个东西,而不是一个一个地给它,每次都必须寻找一个新的位置,它会更快。您可以通过将此行添加到代码顶部来做到这一点:

ant = [1:5];

还有其他方法可以做到这一点。

【讨论】:

  • 完全错误。 MATLAB 错误:无法从 TAnt 转换为 double。
【解决方案4】:

不确定我的问题是否正确,但如果你想初始化一个自定义类“TAnt”的数组,我会这样做

  1. 对于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2015-05-16
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多