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

问题描述 投票:0回答:5

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

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

MATLAB 警告我使用预分配来加速该过程。我确实知道预分配的好处,但我不知道如何对对象执行此操作。

oop matlab
5个回答
11
投票

这里有一些选项,要求您为

TAnt
设计类构造函数,以便它能够处理 无输入参数情况:

  • 您可以创建一个默认的

    TAnt
    对象(通过调用不带输入参数的构造函数)并使用 REPMAT 复制它以在进入 for 循环之前初始化数组:

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

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

  • 如果您的

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

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

    这将使您完全避免循环。

  • 如果

    TAnt
    is 派生自 handle 类,则上面的第一个选项应该可以正常工作,但第二个选项则不行,因为它会为您提供 same 对象的句柄的 5 个副本,而不是5 个用于不同对象的句柄。


6
投票

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

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

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


0
投票

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

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

ant = [1:5];

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


0
投票

不确定我是否正确解决了您的问题,但如果您想初始化自定义类“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
投票

从 MATLAB R2024b 开始,您可以使用

createArray
创建对象数组。

要使用 0 参数构造函数创建 1×

antsNumber
TAnt
数组,请编写:

ant = createArray(1, antsNumber, "TAnt");

如果您需要将参数传递给构造函数,就像在您的示例中一样,请编写:

ant = createArray(1, antsNumber, FillValue=TAnt(source, target));

大小参数在 MATLAB 中按通常方式解释:

  • createArray(n, "TAnt")
    创建一个
    n
    n
    数组,
  • createArray(n, m, "TAnt")
    createArray([n, m], "TAnt")
    创建一个
    n
    m
    数组,并且
  • createArray(dims, "TAnt")
    创建大小为
    dims
    的多维数组。
© www.soinside.com 2019 - 2024. All rights reserved.