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


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

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

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


10423
2018-03-24 18:33


起源

密切相关的问题: stackoverflow.com/questions/591495/... - gnovice


答案:


以下链接可能有所帮助:

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

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


5
2018-03-24 18:40



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


以下是一些选项,需要您为其设计类构造函数 TAnt 这样它就能够处理了 没有输入参数的情况

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

    ant = repmat(TAnt(),1,5);  %# Replicate the default object
    

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

  • 如果你的 TAnt 对象都是用相同的数据进行初始化的 不是 源自 处理班,你可以创建1个对象并使用 REPMAT 复制它:

    ant = repmat(TAnt(source,target),1,5);  %# Replicate the object
    

    这将允许您完全避免循环。

  • 如果 TAnt   源自 处理班,上面的第一个选项应该工作正常,但第二个选项不会,因为它会给你5个句柄副本 一样 对象而不是5个句柄 不同 对象。


7
2018-03-24 18:47



它几乎可以工作,但在此之前它应该被修改为ant = repmat(TAnt(源,目标),0,5) - Kamran Bigdely
@Kamran:那会给你一个空数组(0乘5)。对于预分配,您确实要创建一个默认数组 相同的大小 你将最终得到什么(1乘5)。 - gnovice
似乎是这样,但“(0,5)”有效!当我尝试使用(1,5)时会导致错误。 - Kamran Bigdely
它们都不起作用......它说:表达或陈述不完整或不正确。 - Kamran Bigdely
@Kamran:既然你没有提供有关你的任何细节 TAnt class,我不得不猜测你的错误是由于你没有设计你的类构造函数来处理无输入参数的情况。您必须这样做才能使这些解决方案起作用。看到这个链接: mathworks.com/access/helpdesk/help/techdoc/matlab_oop/... - gnovice


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

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

ant = [1:5];

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


0
2018-03-24 18:44



这是完全错误的。 MATLAB错误:无法从TAnt转换为double。 - Kamran Bigdely


不确定我的问题是否正确,但是如果你想初始化一个自定义类“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


0
2018-06-21 18:53