, ^6 m7 _5 y: C4 n8 S关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# {" \, e. [; f2 ^+ U
其规则总结如下7条:" o2 B. I1 p" n- [" ~" l
1、只有使用以下数据类型,matlab才会对其加速: + X- [6 S$ @! A( w& i) Slogical,char,int8,uint8,int16,uint16,int32,uint32,double 0 f9 n: _- d) V+ {2 k, }而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu6 Q& ^- Z3 @# @3 S$ s1 E
re,single, . L- F& ]# Z% f- Z, T3 _7 y5 H7 A4 u1 ]% V
function handle,java classes,user classes,int64,uint643 Y4 d: Y8 L. o: \7 r+ C9 H
2、matlab不会对超过三维的数组进行加速。0 w' D. Q( P% Y$ a
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 8 H1 t8 Y$ K7 C0 T来表示;3 p7 s" ]5 ?0 K- m
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 3 W$ O I" y* Z% f据类型,只使用 5 ~- ]* g5 g( N1 {" a* l7 V三维以下的数组;c、循环内只调用了内建函数(build-in function)。# ?4 h- J2 p- w8 Z
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将- `+ R2 a) h% s& x3 Z
加速运行。8 u; C8 D4 R3 a0 k* h
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:+ [% U0 p5 e# W
x = a.name; for k=1:10000, sin(A(k)), end; ! B+ E# R$ K: T6 P1 m6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 , f2 |2 v) c- O! G3 o% @3 M2 h度。2 A" T6 c# {0 W
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 ' R3 x q0 s, K q% m; e$ e运行速度。 ; G' j# N1 a7 Q & @# \* o- Y1 m" Y5 O V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 E9 C6 J, j. c0 s
%%%%%%%%%%%%%%%%%%%%%%%) D! H; k- }/ q2 C
二、 遵守三条规则; p& D, C# p% a, ?
- Y M( {4 x' Q$ ^" M) C$ F2 \ O1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic- N" J( `& \2 k. |6 k2 l
h means it is designed3 H/ }+ P# l& p+ ~8 N
% J5 x k7 S# G; R- S* o- E) u0 S+ ufor vector and matrix operations. You can often speed up your M-file c . ~5 F5 e* a# K2 Uode by using- J2 x$ S* S/ J2 D y
vectorizing algorithms that take advantage of this design. Vectorizati & o3 ]# p" c8 t' B3 Oon means converting . i p+ M" t7 l3 t8 Q. F, afor and while loops to equivalent vector or matrix operations.”。改进 5 F: p$ F; ?! {8 s2 G) B c这样的状况有两种方法:+ E9 F0 j7 D: X! t- g- B9 F2 S7 b
Y9 s, {: B0 ]( o, Wa、尽量用向量化的运算来代替循环操作。如将下面的程序:7 S- g0 O. ] a3 X; N1 X$ a
! E! U7 w2 j$ N7 ?
i=0;% u2 [$ M( r' r
for t = 0:.01:10 : L5 Q/ v/ n9 T! t) {0 i$ Gi = i+1;0 X2 j( v5 H3 u2 o( a
y(i) = sin(t); 8 x0 m5 t3 } R3 v' Mend 0 s5 }0 O6 {+ }$ k2 `7 Y$ V替换为: # u9 T: m8 U0 A5 B: S$ I* R2 [t = 0:.01:10;9 G+ M* n9 N& R' ?; C
y = sin(t); 8 K+ k, L- b- ~- u; U3 j5 W% H速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i" G0 e$ [, _$ Q' F
permute、permute、. X" r) k, D! _ _) D* v, G
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums7 X, e: L" X0 j/ o% E9 C1 r% H# [% ?
um、ind2sub、 - R. [( h* N, |1 o% J8 Dndgrid、repmat、sort、sum 等。8 E0 l8 f, V! k4 W" H* g5 P
3 c$ w* p7 F, m& l8 V请注意matlan文档中还有这样一句补充:“Before taking the time to % Y& P2 b. y8 y/ P / r+ K! w {# \5 A) vvectorize your code, read the section on Performance Acceleration.. a: v. [, |* k
You may be able to * P+ E& W( R& d: v+ b) Gspeed up your program by just as much using the MATLAB JIT Accelera 7 \7 \, Z7 G0 N: w6 g: }tor instead of ; B) N& ]( [+ I m V N6 Ovectorizing.”。何去何从,自己把握。3 Q/ I' Q- k9 _9 P
0 n J5 U+ ^, n. Ab、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 2 o, F& Y4 [, k3 B行循环次数少的,/ i+ i% b$ q" A) R0 H; r
内环执行循环次数多的。这样可以显著提高速度。# T/ a' P9 g3 a+ M# \2 X2 u
4 F& U# c j: g( h a' N8 W
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on & c# r5 X- e8 G" A( O! ]: ues、cell、struct、, \+ R* X1 ], w
repmat等。 9 _( y% g. k, ~$ F: S- Q- i' Yb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: }7 s) I4 x" }- D5 Z# K0 u- ` + P5 i* L9 d6 Q/ P! n0 ZA = int8(zeros(100));, N M# J5 {0 v- t
换成: . G4 b1 w; A& ^7 A$ rA = repmat(int8(0), 100, 100); 2 t0 e; o0 S0 ~8 _9 h/ Hc、当需要扩充一个变量的大小、维数时使用repmat函数。' _8 C9 j0 s/ ]# J" w* I( Z
4 K# }1 y3 ?' ~& G- _4 d- d) ?0 H6 l
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。3 y8 r ^% t, O- T0 h" G& ]6 r8 F
b、使用Functions而不是Scripts 。 ; ^3 `. I! C( M4 ^. O$ Z/ x2 {! ], m i4 w: {
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% {9 Y; X0 F$ f. ]# V( a
%%%%%%%%%%%%%%%%%%%%%%% 4 Z0 X2 ]; r R0 ?% z% |三、 绝招3 A3 K; y3 }6 ?+ D; D! f- Q
1 f) Q8 {0 Q7 Y, d& [你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 / e1 z M$ ]" F1 |0 V1、改用更有效的算法6 F% K: r& C, o( V/ A* |# Q, h; W
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。7 n/ Z$ M3 S1 g; Z9 G7 A8 e+ _
& Q; E4 |% ^3 z) K
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++8 R6 u' M# z& l. t B' O5 L
语言文件,VC编译