小编Jac*_*cob的帖子

在创建句柄对象数组作为对象属性时,如何避免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)

arrays oop matlab memory-management properties

9
推荐指数
1
解决办法
3058
查看次数

在单元格数组中存储句柄对象时性能下降

我只有一小部分MATLAB代码存在大量性能问题,希望您可以了解如何改进它:

我正在MATLAB中开发一个基于代理的模拟,它创建了许多句柄对象.其中一些是代理,其他可以是例如代理所拥有的对象.

为了清楚地识别每个句柄对象,每个句柄对象都获得由" IdDistributor "对象发出的唯一Id(obj.Id).所述IdDistributor本身被移交给各对象的构造也就是resive ID和从那里调用来发出一个Id-数(giveId).

此外,IdDistributor还保留了一种电话簿(IdRegistry),它将每个Id与对象相关联.因此,鉴于Id,可以在IdRegistry中查找对象.

我通过使用一个单元格数组来实现这一点,该数组数组将不同的句柄对象存储在与其Id匹配的字段中.(正常数组不起作用,因为对象属于不同的类).

测试我的模拟非常慢,MATLAB Profiler显示99%的时间用在IdDistributor上,特别是在IdRegistry中存储对象的(当我尝试创建大约10,000时,每个对象需要花费1秒钟)对象).

现在我想尝试一种类似的解决方案,花费更少的时间.正如你在下面的代码中看到的那样,我已经尝试通过预分配来提高速度(当它已满时,我将IdRegistry扩展10,000个单元,而不是逐个增加1).我还想过试图以某种方式获得当我读到Id不是永久性的并且可以被系统更改时,句柄对象的MATLAB内部Id但没有遵循那条道路.

我非常感谢任何想法如何加快代码或找到解决方法/改进我的概念!

在这里我的代码:

最慢的行是IdDist.IdRegistry(IdNumber)= {obj};

顺便说一句.将其更改为IdDist.IdRegistry {IdNumber} = obj; 没多大帮助

classdef IdDistributor < handle

properties
    Id=int64(1); %Her own ID
    LastId=int64(1);
    IdRegistry={}
end

methods
    function IdDist=IdDistributor()
        IdDist.Id=int64(1);
        IdDist.LastId=int64(1);
        IdDist.register(IdDist);
    end …
Run Code Online (Sandbox Code Playgroud)

arrays oop performance matlab

6
推荐指数
1
解决办法
1006
查看次数