Performance MATLAB类数组

Performance MATLAB类数组,performance,arrays,matlab,oop,Performance,Arrays,Matlab,Oop,在MATLAB中管理同一类的大量实例的最佳方法是什么 使用朴素的方法会产生不真实的结果: classdef Request properties num=7; end methods function f=foo(this) f = this.num + 4; end end end >> a=[]; >> tic,for i=1:1000 a=[a Reque

在MATLAB中管理同一类的大量实例的最佳方法是什么

使用朴素的方法会产生不真实的结果:

classdef Request
    properties
        num=7;
    end
    methods
        function f=foo(this)
            f = this.num + 4;
        end
    end
end

>> a=[];  

>> tic,for i=1:1000 a=[a Request];end;toc  

Elapsed time is 5.426852 seconds.  

>> tic,for i=1:1000 a=[a Request];end;toc  
Elapsed time is 31.261500 seconds.  
继承句柄可显著改善结果:

classdef RequestH < handle
    properties
        num=7;
    end
    methods
        function f=foo(this)
            f = this.num + 4;
        end
    end
end

>> tic,for i=1:1000 a=[a RequestH];end;toc
Elapsed time is 0.097472 seconds.
>> tic,for i=1:1000 a=[a RequestH];end;toc
Elapsed time is 0.134007 seconds.
>> tic,for i=1:1000 a=[a RequestH];end;toc
Elapsed time is 0.174573 seconds.
classdef RequestH>tic,对于i=1:1000 a=[a/h];结束;toc
运行时间为0.097472秒。
>>tic,对于i=1:1000 a=[a/h];结束;toc
运行时间为0.134007秒。
>>tic,对于i=1:1000 a=[a/h];结束;toc
运行时间为0.174573秒。
但仍然不是一个可接受的性能,特别是考虑到不断增加的重新分配开销

有没有办法预先分配类数组?如何有效地管理大量的物品

谢谢,

丹尼是你的朋友:

b = repmat(Request, 1000, 1);

Elapsed time is 0.056720 seconds


b = repmat(RequestH, 1000, 1);
Elapsed time is 0.021749 seconds.
通过追加来实现增长的速度非常慢,这就是为什么mlint会将其称为。

此解决方案将继续扩展。使用repmat初始化RequestH对象数组,然后使用循环创建所需对象:

>> a = repmat(RequestH,10000,1);tic,for i=1:10000 a(i)=RequestH;end;toc
Elapsed time is 0.396645 seconds.
这是对以下各项的改进:

>> a=[];tic,for i=1:10000 a=[a RequestH];end;toc
Elapsed time is 2.313368 seconds.

来得这么晚,但这不是另一个解决方案吗

a = Request.empty(1000,0); tic; for i=1:1000, a(i)=Request; end; toc;
Elapsed time is 0.087539 seconds.
或者更好:

a(1000, 1) = Request;
Elapsed time is 0.019755 seconds.

问题:b=repmat(RequestH,1000,1);b(1).num=99;b(2).num ans=99这是句柄类的性质。它基本上是一个单例类,所以所有“实例”实际上都指向一个实例。我只是在展示加速。是否使用句柄类是一个非常独立的问题。