Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何在MATLAB中预先分配类数组?_Oop_Matlab - Fatal编程技术网

Oop 如何在MATLAB中预先分配类数组?

Oop 如何在MATLAB中预先分配类数组?,oop,matlab,Oop,Matlab,我在MATLAB中有一个对象数组,我在循环中调用了它们的构造函数: antsNumber = 5; for counter = 1: antsNumber ant(counter) = TAnt(source, target); end MATLAB警告我使用预分配来加快进程。我确实知道预分配的好处,但我不知道如何对对象进行预分配。以下链接可能会有所帮助: http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#br

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

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

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

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

http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh

新链接:

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

它之所以会给你错误,是因为它必须找到新的空间。比如,我给你一张七个物体的清单,我告诉你你需要把它们排成一行,然后我离开,给你一些你需要放在某处的东西。然后我给你第八个物体,告诉你把它放在第七个物体后面。因为你有第八个物体所在的物体,你要么把它移到一边,要么把所有七个物体都移到一边。Matlab告诉你,如果你事先告诉它,你想把5个东西放进去,而不是一个一个地给它,每次都要寻找一个新的位置,它会更快。您可以通过在代码顶部添加以下行来完成此操作:

ant = [1:5];

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

这里有几个选项,要求您为
TAnt
设计类构造函数,以便它能够处理:

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

    ant = repmat(TAnt(),1,5);  %# Replicate the default object
    
    然后,可以在数组上循环,用新对象覆盖每个默认对象

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

    ant = repmat(TAnt(source,target),1,5);  %# Replicate the object
    
    这将允许您完全避免循环

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


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

  • 对于TAnt的构造函数方法,请输入以下内容:
  • function obj=TAnt(源、目标)
    如果nargin>0
    obj.mySource=源;
    obj.myTarget=目标;
    其他的
    obj.mySource=默认值;
    obj.myTarget=默认值;
    结束
    
    结束
    密切相关的问题:谢谢,这非常有帮助。我添加了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)
    中的元素调用的),那么它是完全错误的。MATLAB错误:不可能从TAnt转换为double。它实际上可以工作,但在此之前,应该将其修改为ant=repmat(TAnt(source,target),0,5)@Kamran:这将为您提供一个空数组(0×5)。对于预分配,您确实希望创建一个默认数组,其大小与最终的大小相同(1×5)。看起来是这样,但“(0,5)”可以工作!当我尝试使用(1,5)时,它会导致错误。它们都不起作用。。。它说:表达式或语句不完整或不正确。@Kamran:由于您没有给出有关
    TAnt
    类的任何详细信息,我猜您的错误是由于您没有设计类构造函数来处理无输入参数的情况。您必须这样做才能使这些解决方案起作用。请参阅此链接: