EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将+ O. N0 V9 P" h$ [$ s
其规则总结如下7条:
) g/ i5 }% w: ~0 H" W; O1、只有使用以下数据类型,matlab才会对其加速:& W! N. _4 ?5 k8 _- l
logical,char,int8,uint8,int16,uint16,int32,uint32,double3 t7 c2 z" N. a; Q# G' I" V
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
% r K% r9 Q+ j% Q. s' Q" {4 Nre,single, function handle,java classes,user classes,int64,uint64- n# ^* R2 r' t( C+ s) s: E/ R
2、matlab不会对超过三维的数组进行加速。
: H) S/ |; b B, R6 z% \9 Z# v3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值4 Y8 {! K) S' i& O
来表示;
{0 a# r& B/ y3 J: |b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
' o4 h4 e5 q5 ^; b) e' n据类型,只使用1 ~ n1 r! V# p5 ^
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
v9 M' w! W% R6 O) w+ ?7 {4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将5 k6 C* x5 y y9 q8 D3 e2 m
加速运行。2 q4 U/ ]9 t- y- c( h1 P( {
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:5 V' Q* m* k3 M& w) G$ W# O$ c
x = a.name; for k=1:10000, sin(A(k)), end;: h- e) R( e0 y4 o$ `& f R! I
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
- j+ ?' ]# N( V! q度。
- L1 f4 Y3 ]5 h: I' w/ N# }7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低1 h' u% E r. ]
运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( |- }5 m ?( R9 r/ |( }%%%%%%%%%%%%%%%%%%%%%%%6 z9 W7 L: W) s) |- Z1 w7 u- y
二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
3 Y3 H" t" M; P% r+ E3 b: A7 Bh means it is designed for vector and matrix operations. You can often speed up your M-file c
- L2 n$ }: X% ^" node by using7 e% E) E$ \. i
vectorizing algorithms that take advantage of this design. Vectorizati, O+ Z. @% J8 z* y% J
on means converting! Q" `# d2 J% k" r* b. @# J/ _
for and while loops to equivalent vector or matrix operations.”。改进" [, _! E- P/ k' ?3 b
这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;
( B+ _+ s0 D8 C8 _+ X1 Y cfor t = 0:.01:10 X9 g9 [* P) W5 S
i = i+1; ]( @. S. U1 A$ d' _: Y9 G6 c6 I( v
y(i) = sin(t);
8 a% U/ t8 {1 l9 w" z0 @* Y9 ^end( c7 L7 _, e$ u; K* o
替换为:2 e3 S2 I- ^4 a+ e0 a9 S r
t = 0:.01:10;
8 r4 Z, N7 F8 Uy = sin(t);
. r) e$ I1 E& ]/ c. g, F速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
+ S* `7 m7 O* g6 J& Npermute、permute、
# \# s# q* n8 [# O3 r, V( _4 S' Dreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums, e+ o: }& G% w l
um、ind2sub、
1 I1 N# _" K) e) j0 I' qndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration./ i3 f7 w o8 D e
You may be able to
1 X3 v9 o3 U/ `4 u1 B. c) j3 vspeed up your program by just as much using the MATLAB JIT Accelera& C& s( Y6 d- V& y
tor instead of) v) z" q' ~( a$ T5 L9 C
vectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执# ]9 R8 _- {% q$ u, z
行循环次数少的,+ }5 i% ]7 u3 Y: c+ J
内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
, E5 I8 m( l- `3 v5 p- mes、cell、struct、/ \$ h( M4 {4 X
repmat等。
7 Q9 s/ r) B% Q# h% q, nb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));
4 L4 Q9 [9 R8 B换成:9 \4 \4 U5 i- F3 V: z* U' J/ W: F9 M
A = repmat(int8(0), 100, 100);
3 A* n; |8 K$ o% I% F% Xc、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
! D/ O1 R/ c$ y( r0 H: Q: Tb、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: Q4 j2 n ^1 C8 Z/ @+ T%%%%%%%%%%%%%%%%%%%%%%%
& h9 k0 K& _, W4 s! }% ~" \三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。! q F. e7 d6 ]9 Q: j
1、改用更有效的算法) X4 F/ j7 Y4 e! Y. o" S
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。- D0 W, V7 z2 E$ {
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧
- b4 @6 B3 U& u: b9 x$ Q/ g |