: B8 ]( j) K/ S# }1 l加速matlab运行的三重境界 3 k) W0 }2 K0 S4 T9 ?9 m . n6 P9 D. z' `; M3 v, V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0 X6 z) d/ e% n# e. J%%%%%%%%%%%%%%%%%%%%%%%% E0 Y+ |+ c# J& P0 T
一、 遵守Performance Acceleration的规则8 `8 J S/ u3 L
二、 遵守三条规则 & K& n$ \, h$ H; R. n; \9 w三、 绝招 0 G, g/ w4 @( f: s; D8 Q S$ k- h. q( C D. D) l. ~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ z/ l+ Z( @/ R6 Y
%%%%%%%%%%%%%%%%%%%%%%%8 ?4 U# t- U) v! u
一、 遵守Performance Acceleration的规则! J) Q2 F1 t* c' G# R/ \# B
K$ L: y% y' S2 Y1 D9 w
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# x' ? i+ Y" ?6 k" \0 S
其规则总结如下7条:* G6 p0 {* B! o$ Y8 N
1、只有使用以下数据类型,matlab才会对其加速: 8 z; q+ j0 D7 ^4 ^' I" Blogical,char,int8,uint8,int16,uint16,int32,uint32,double! ~. D% }- f. B2 x
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu " f0 @# q6 `; f* O5 Z" [6 qre,single, % U7 B. \5 ~ n, W" f* B) S, g# g4 ]9 k: }4 l; \0 }
function handle,java classes,user classes,int64,uint64( U; N9 r; O$ B f2 T. L
2、matlab不会对超过三维的数组进行加速。 , b. {, l* ^& C9 L" p4 v3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 4 s( t; R% o1 u$ @; l$ q来表示; o) p9 e3 @ `- T+ J. p+ u: w0 nb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 T: @6 a/ f' Z5 a7 }, @
据类型,只使用 & M# d' ^- x- b/ p三维以下的数组;c、循环内只调用了内建函数(build-in function)。 ; }8 N$ c- ^ z9 S' \5 O4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 2 ~# Z. S( t; R" j加速运行。7 n1 @) p) T: m( D" ?
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:. K/ H9 F2 K4 f- C/ B
x = a.name; for k=1:10000, sin(A(k)), end;$ W8 M7 T/ t& C1 J8 \7 [
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 7 A+ P0 `+ \" N# K9 b) T& ?) D度。 / L8 i l, E6 j5 P- s- Q7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低3 _( u- L S+ X' Y3 \+ ~
运行速度。! i4 F7 p2 i7 ~
$ {. O* U$ D) {& B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 E2 H$ Z! |+ P) K
%%%%%%%%%%%%%%%%%%%%%%% ; }' D' L" x" v s# |) J二、 遵守三条规则 0 }2 Y$ o7 W- H9 ] 8 D4 O s- w P3 y# ]% e$ z5 S3 C/ n1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 0 {. O6 d2 N/ q- P+ B+ s" Wh means it is designed j5 x/ }( w' c5 `, z( @9 d3 s) v
for vector and matrix operations. You can often speed up your M-file c$ D9 J3 q: @- Q, `
ode by using& e/ x! H: g5 \, Q/ G3 r
vectorizing algorithms that take advantage of this design. Vectorizati& Q) s) Q! b! X# w v
on means converting+ s( c2 a6 t. _% F) r2 F
for and while loops to equivalent vector or matrix operations.”。改进; c8 ]% Z G% D2 p- a" l7 q- E
这样的状况有两种方法:$ Y5 s. V: ~4 I5 L7 l- l; K, ?
" O' a! G+ B+ B. Q* h5 ta、尽量用向量化的运算来代替循环操作。如将下面的程序: / t0 t8 B+ ?% {+ m8 r) D) ~; y. ?# \* G% M
i=0;6 m- U, J, Y( n6 d* n4 o
for t = 0:.01:10 \. A7 h0 w: X, D( li = i+1; 5 X/ y: |. {3 |y(i) = sin(t); ' w6 c6 C! C' G9 Dend 6 e# M6 E+ E+ k& N* k4 s9 u替换为:8 u/ t B% i8 N
t = 0:.01:10;5 z: Z# @5 s: _) f" e u
y = sin(t); ' s% p/ _ D% m速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i [; |0 W9 V0 d( B' o- Ppermute、permute、 k' t) K, V. _6 C& K0 I- g+ freshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums 5 D9 @" i1 n" O6 H/ f& @, @# I- X: eum、ind2sub、2 P. H1 b- Z- p1 Z7 J. O
ndgrid、repmat、sort、sum 等。 ) S- E0 v& w& V6 V4 r% \$ I $ Z4 @! e2 k; j/ ^7 L7 C请注意matlan文档中还有这样一句补充:“Before taking the time to2 k7 U) [7 q- a: }4 A
: r6 _% o0 v5 m8 b4 S* _vectorize your code, read the section on Performance Acceleration.' c* _; ]6 O. j& q2 S" I; e
You may be able to( [2 H% x8 {6 i+ j! L8 M9 i8 `
speed up your program by just as much using the MATLAB JIT Accelera 7 `4 X5 J* j# ^8 C7 O! g' ktor instead of0 G8 ^, \, u1 ~
vectorizing.”。何去何从,自己把握。 # O4 x5 E2 Z, X- a % d( Y7 Q; [+ B" _# q: j) Ib、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执2 X5 |7 B" [+ v7 G, h' Z, }9 T
行循环次数少的, - b T: d1 \& ^$ Z内环执行循环次数多的。这样可以显著提高速度。+ Z7 u# K; ~% J0 J3 J5 \4 y7 o