我在MATLAB中有一个对象数组,我在一个循环中调用它们的构造函数:
antsNumber = 5;
for counter = 1: antsNumber
ant(counter) = TAnt(source, target);
end
Run Code Online (Sandbox Code Playgroud)
MATLAB警告我使用预分配来加速该过程.我确实知道预分配的好处,但我不知道如何为对象做到这一点.
在我看来,当在Matlab中创建一个简单的句柄对象数组时,它就是线性的.但是,如果我创建完全相同的数组并将其存储为对象的属性,则时间会呈指数级增长 - 因此在创建许多对象时程序会变得非常慢.
我的问题是为什么会发生这种情况以及如何避免这种情况? 对象属性的预分配是否在我的代码中没有正确实现,或者Matlab处理这些事情的方式是否存在根本问题?
我写了一个简单的测试来说明这个问题:
简单对象代码:
classdef SomeSimpleObject < handle
% SomeSimpleObject defines an Object that has one property
properties
property=0;
end
methods
function SimpleObj=SomeSimpleObject()
if nargin~=0
SimpleObj.property=1;
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
使用以下脚本创建1x10.000这些简单对象的数组根据我的机器上的分析器0,4秒:
for n=10000:-1:1 % counting backwards for Memory pre-allocation
ObjectList(n)=SomeSimpleObject();
end
Run Code Online (Sandbox Code Playgroud)
然而,在类构造函数中执行相同的操作并将10.000个对象的数组存储为属性需要59秒,并且它会更快地变得更糟.通过从这个类创建一个对象来尝试它(例如a = HostingObject)
classdef HostingObject < handle
% This Objects Hosts a List of Objects that are created in the
% constructor
properties
ObjectList=SomeSimpleObject
end
methods
function …Run Code Online (Sandbox Code Playgroud)