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

14

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

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

MATLAB提醒我使用预分配来加速过程。我知道预分配的好处,但不知道如何为对象进行预分配。


1
紧密相关的问题:https://dev59.com/ikbRa4cB1Zd3GeqP27Ma - gnovice
4个回答

11

以下是几个选项,需要您设计TAnt类的构造函数,使其能够处理无输入参数情况:

  • 您可以创建一个默认的TAnt对象(通过不带输入参数调用构造函数),并使用REPMAT进行复制来初始化进入for循环之前的数组:

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

    接着,你可以循环遍历数组,并用新的对象覆盖每个默认对象。

  • 如果你的TAnt对象都使用相同的数据进行初始化,并且它们不是句柄类派生而来,则可以创建一个对象并使用REPMAT进行复制:

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

    这将使您完全避免循环。

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


它基本上可以工作,但在此之前应修改为 ant = repmat(TAnt(source,target),0,5)。 - Kamran Bigdely
@Kamran:这将给你一个空数组(0-5)。为了预分配,你真正想要创建一个默认数组,其大小与最终结果相同(1-5)。 - gnovice
看起来是这样,但“(0,5)”可以工作!当我尝试使用(1,5)时会导致错误。 - Kamran Bigdely
没有一个能用...它说:表达式或语句不完整或不正确。 - Kamran Bigdely
文档链接已失效。可以在此处找到链接内容:https://web.archive.org/web/20120306193932/http://www.mathworks.com/help/techdoc/matlab_oop/brd2m9e-1.html - Vasco
显示剩余2条评论

6

谢谢,这非常有帮助。我添加了ant = TAnt.empty(antsNumber,0)并且它可以工作! - Kamran Bigdely
根据链接,答案是 ant = TAnt.empty(antsNumber, 0)。 - Kamran Bigdely
7
你使用对象的 empty 方法的解决方法可能是有效的,因为它能使 MATLAB 不再警告你需要预分配,但这并不是真正的预分配,因为它仍然是一个 数组。请注意文档中 Waleed 提供的链接下的说明:“如果对属性值进行赋值, MATLAB 将调用 SimpleClass 构造函数将数组增长到所需大小。” 注意 增长 这个词,表明数组在被赋值时会改变大小,而这正是预分配所要避免的。 - gnovice
5
正如gnovice所指出的那样,使用静态方法empty并不能真正执行预分配。相反,在for循环之前,你应该添加以下代码行:ant(antsNumber) = TAnt(source, target);,前提是你有一个默认构造函数,并且nargin=0(这将用于ant(1:antsNumber-1)中的元素)。 - Amro

1

它给出的警告是多余的,除非你在进行计算密集型的操作,否则我会忽略它。

它给你错误的原因是因为它需要找到新的空间。比如说,我给你七个物品的列表,并告诉你需要把它们都排成一行,然后我离开了,给你更多需要放置的东西。然后我给你第八个物品,并告诉你将其放在第七个物品之后。因为第八个物品的位置已经有东西了,你要么必须将其移开,要么必须移动所有七个物品。Matlab 告诉你,如果你事先告诉它你想要放置 5 个物品,而不是一个一个地给它,每次都要寻找新的位置,那么它会更快。你可以通过在代码顶部添加这行来实现:

ant = [1:5];

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


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接