EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
) D. l: j% m; G* q* n2 ^; _其规则总结如下7条:0 k2 _$ B2 m$ p7 W5 p6 q% J6 i
1、只有使用以下数据类型,matlab才会对其加速:
1 R# r1 T7 z, y2 V" k5 Z6 O: slogical,char,int8,uint8,int16,uint16,int32,uint32,double
" v1 y3 n$ p5 O' e2 L7 s6 x而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
# R0 F* k' N0 s' |- s$ y8 kre,single, function handle,java classes,user classes,int64,uint64, S( v, s" M7 v
2、matlab不会对超过三维的数组进行加速。1 n, ~8 ~. L5 F( u0 I U5 C
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
( Y Z4 Z" Q) l0 c2 w* V% P/ E$ z来表示;
$ m8 \# S( B3 k# Zb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
$ Z% ^8 d8 b( R6 I4 J据类型,只使用5 P1 Z7 W: Q+ L ~' m }
三维以下的数组;c、循环内只调用了内建函数(build-in function)。! V# }/ x9 L! U8 u+ f/ R# F
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将4 e# n0 O' F" L3 l1 y5 a' B7 F
加速运行。
5 \. E$ I/ R8 }; }: P6 b5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
) d, c( D& j: k( v( Dx = a.name; for k=1:10000, sin(A(k)), end;
) _& m! E: _. i, q B. ^; c6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
2 e& k; i% _5 ^9 u度。( D; D" U7 d- Q7 }( u' k" Q1 X
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
' I& a- m, X3 [4 |7 Q* j) u, V0 J8 O) \运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ {& o' F3 X2 I/ g% y%%%%%%%%%%%%%%%%%%%%%%%+ C J4 p# M2 {$ i" O: e" X* o
二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
9 n$ G, I, }! @/ g! W; Nh means it is designed for vector and matrix operations. You can often speed up your M-file c
$ C Y7 v* B9 mode by using* \ x- h2 d& E; \; a q
vectorizing algorithms that take advantage of this design. Vectorizati
7 Y3 ~( x* H5 w1 m/ w" z) Y1 hon means converting
4 C: c2 ~0 I# J: z# g9 rfor and while loops to equivalent vector or matrix operations.”。改进
! x' |$ c; ?9 Q- _/ G: l这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;% u' f6 ~% L) e$ x
for t = 0:.01:10; |5 r+ t' r! Z+ W% y
i = i+1;1 G$ n9 N& i3 ~0 P7 R8 A6 y
y(i) = sin(t);; f8 H1 L# m0 K! K& U' F) q7 w' k
end
, h [9 P* W$ k- Z, V9 o替换为:
$ `3 u9 s1 m" g. {$ ?$ Xt = 0:.01:10;
( V h' Y2 ^1 n7 P7 hy = sin(t);0 U: `8 g/ T8 l! w4 ^0 [: c. p
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i8 m' G2 H; x8 i) V8 W7 C }! n
permute、permute、
8 S) R! U `3 \% j. Oreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums' r: K& e+ j$ N6 G" B6 q
um、ind2sub、2 D' D. g! A1 H1 P+ T
ndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration.
8 S! o9 a2 N0 e3 eYou may be able to
: n( b& S1 f- K8 pspeed up your program by just as much using the MATLAB JIT Accelera# E1 S; s1 R- ]9 p* A4 b1 {
tor instead of
7 i+ h2 s. @+ ]- @/ _. A' _3 rvectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
4 i4 Z/ t. }( S" n行循环次数少的,& E' H1 ^/ s3 D4 }; h
内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on1 u8 b3 e$ D! ~/ T
es、cell、struct、
! a# x' l- ]& v* lrepmat等。
H: X) F5 a4 \0 ]+ vb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));) @) x1 X! u9 D* ?
换成:
8 a; U% n& J, w- tA = repmat(int8(0), 100, 100);
* t8 g& [; Q! g5 O! A: Kc、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。6 b6 d0 U+ ]6 P2 G0 u* U! V1 G
b、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' K& h1 U. K9 y7 u. n' f
%%%%%%%%%%%%%%%%%%%%%%%' C! T& w4 ^% S+ p& ]/ k' ]8 T$ d
三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。* m$ J. y$ R; }
1、改用更有效的算法
' U; x+ K! z" N/ q, _# o) E! z% p1 p2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
) R7 e: s$ _" i* L. w! \3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧
& c8 m5 I5 v8 m/ S4 _ |