Performance MATLAB类数组
在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
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这是句柄类的性质。它基本上是一个单例类,所以所有“实例”实际上都指向一个实例。我只是在展示加速。是否使用句柄类是一个非常独立的问题。