本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
! P2 _6 Z; p8 F t- ?8 |4 M$ R( ~+ T7 ^1 G
加速matlab运行的三重境界 加速matlab运行的三重境界6 {) _0 v+ e8 J! k# w/ t2 P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! [) f& N3 A% S%%%%%%%%%%%%%%%%%%%%%%%
$ C; V, h6 O, u' a一、 遵守Performance Acceleration的规则
- d" {. n- P" i8 D+ q# j( ?1 l. o二、 遵守三条规则" l" {/ w2 N2 ?; t) `0 ]+ T1 c" L
三、 绝招
* u" ^* l7 m) }9 w( z" w%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 B4 P+ [ e2 d- g7 [
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则; ? N ]& p) D/ X# I
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将, r7 {8 [7 L) {& J+ Z
其规则总结如下7条:& M, ?3 G) n+ E6 _0 q
1、只有使用以下数据类型,matlab才会对其加速:% l; T2 w# _2 r# u! i
logical,char,int8,uint8,int16,uint16,int32,uint32,double
3 C9 ]. C* A) B8 p而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu2 H @* y8 M: k
re,single,
. k# T2 n2 Y5 R) c4 mfunction handle,java classes,user classes,int64,uint64* ~3 u1 c7 w3 |
2、matlab不会对超过三维的数组进行加速。" {8 d" A3 p4 S
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值3 h. V; H. p# _4 S6 E! p$ I( T
来表示;/ }9 L! z- _& g/ L
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数" n' Z" i. ~5 H, R. S/ O
据类型,只使用8 S! l9 I% P/ ~% @2 C4 u
三维以下的数组;c、循环内只调用了内建函数(build-in function)。0 Q/ @' O! S. f" ~8 j _' W
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
# b/ n t! P0 ^# p j9 p加速运行。
0 e6 L/ y' A% _4 @) M- C: O5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
1 K6 L6 r8 @/ F1 n; Tx = a.name; for k=1:10000, sin(A(k)), end;
* p% H* ?- R% H: R6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
|# W* A5 G5 q" g5 ^+ |- R度。% P: u* i( P) R0 T
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
. m$ A/ T2 s* W# `6 u; R$ N' |9 F运行速度。
5 @- p5 d. i8 L7 h%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! {1 |2 Z R- t0 m( B g%%%%%%%%%%%%%%%%%%%%%%%
- m$ w7 W% ^: ^- v二、 遵守三条规则
{5 b7 V% t/ i; Q' c1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic) M% L( p+ U7 N D8 c
h means it is designed
: k3 b. i$ N( S+ {. s4 y) d: jfor vector and matrix operations. You can often speed up your M-file c
2 h1 Y7 n5 ?' ]$ T7 e$ wode by using. t# q' ?+ j) N4 O- {. ]: f( r# S
vectorizing algorithms that take advantage of this design. Vectorizati% a6 p+ i- e0 I+ F; j
on means converting: m5 H# j2 W6 U, I2 j
for and while loops to equivalent vector or matrix operations.”。改进- {9 U" s1 k8 u# Y% T% L& t
这样的状况有两种方法:
2 ~9 A5 C4 @: T* s! Ba、尽量用向量化的运算来代替循环操作。如将下面的程序:
" ]4 ^4 \: T" R( Vi=0;' e8 W; a, \2 Q6 Z8 ]1 \+ I$ G! K
for t = 0:.01:10' C0 q% G( E: l' l0 S, _
i = i+1;, h% T+ C/ x: ]' z* Q& i
y(i) = sin(t);
1 P+ T1 P t9 h9 D9 W) dend
7 z q! M' Q' i8 a/ m; E+ c替换为:
+ ~8 N5 p0 I6 Y( E; \- Qt = 0:.01:10;
- ^) t& I' ?" t6 Ey = sin(t);1 }8 M. m; r( D/ N
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i0 \4 k+ `( r* X
permute、permute、# S3 E+ z. d6 a" b' w
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums0 M; _! G9 Z) b
um、ind2sub、
) P1 {9 d& p8 s: j0 F O v" @ndgrid、repmat、sort、sum 等。
$ M: w7 C8 S# N% D+ o1 `& X' ]请注意matlan文档中还有这样一句补充:“Before taking the time to
3 `* V. c3 v# B# d4 O6 f: gvectorize your code, read the section on Performance Acceleration.8 g; N( c7 R. E g
You may be able to
: o% @' T1 Q# f6 Pspeed up your program by just as much using the MATLAB JIT Accelera8 V; }8 x" v2 V" w
tor instead of
6 Y/ Z0 J( X+ Q! ?; W/ H, Avectorizing.”。何去何从,自己把握。# O+ [) r3 |* o
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
* s& i8 T" U' W1 D行循环次数少的,. N) K, p2 `8 ~, m) h1 i0 ^: |
内环执行循环次数多的。这样可以显著提高速度。
! q$ A! W; ]( S2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
% \1 P9 g4 T, a- V/ Jes、cell、struct、
. N6 m, w4 T4 i+ t0 v- H7 crepmat等。, B6 Y+ L* d0 } Y0 ?- f
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
+ `$ I9 L3 I4 s" n+ ]& gA = int8(zeros(100));
2 Q3 b; ~. ~2 z U1 T7 z5 W换成:
7 B# S6 u0 N" O9 t3 Z' b* F" mA = repmat(int8(0), 100, 100);7 R+ n6 J( V& r5 G
c、当需要扩充一个变量的大小、维数时使用repmat函数。
" l2 t3 m( ]. g# S" m4 Q3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。1 R1 d1 ` W- [* e
b、使用Functions而不是Scripts 。4 D5 `' i8 v% L2 T t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 e9 e4 ]/ j& }" J) J( o
%%%%%%%%%%%%%%%%%%%%%%%
0 Y. I* ]$ e3 }" L' o6 {! b# j三、 绝招& B* v" k, `) a* g' J
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。$ |* x8 L7 T2 I' b/ W
1、改用更有效的算法* b: M/ r5 v; Y d
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 % e3 H/ ?$ p, l& e- G7 F7 Y
# I" y4 u: K6 f# Z1 v 来源:iLoveMatlab
9 c0 ], P$ D' M- j! F Z$ c" A, }8 F9 ^9 q
9 b+ y7 h+ T1 r8 y0 K
在这里本人推荐使用‘绝招’。 |