5 [ g8 E: Q7 I, w) d* A/ Afunction handle,java classes,user classes,int64,uint64& ]* ?5 o! t6 p
2、matlab不会对超过三维的数组进行加速。 * G }4 b. `4 u! E1 e3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值2 z6 q" G G7 K: T( G4 G* M
来表示; 1 P+ o7 ?1 z" S+ e0 zb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 2 ?; Y- J/ ?- q- T# M; b' b据类型,只使用 9 y4 J0 H6 {- A" G" f8 V" N. C% i三维以下的数组;c、循环内只调用了内建函数(build-in function)。 R; l- D" g$ D# J3 U1 U, o/ u4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将5 o1 R3 |3 y5 _; c# a% r7 f
加速运行。: n& g L9 F; t
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: & D' L% ~. @; C% v- S$ e0 m3 Px = a.name; for k=1:10000, sin(A(k)), end;' T( P/ _; M0 s9 ^* G( w
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 c Y& k# {! ~% C1 t$ L$ q: S! u5 J
度。 . [! T! z( I$ r5 b2 x! @6 t7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 + I' r. j, v/ O, m( D( |运行速度。 ' i' n# f" ^0 y) t7 e& I" \* c4 e0 l8 l+ V
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 ?, t) ?4 r4 g: r# h; F%%%%%%%%%%%%%%%%%%%%%%%8 |, ? i4 d- q
二、 遵守三条规则2 x4 F( l1 c- D* R0 b! Q* L- M* W
7 e5 Z0 j( v8 @0 q7 x* @$ t/ W; ~1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic0 O. e, t. k# E' k& \. L
h means it is designed / H6 |7 N3 M3 l$ w ' w0 |: h6 Y6 m% X, Jfor vector and matrix operations. You can often speed up your M-file c6 T" S7 x1 T9 b4 {* }5 \$ J
ode by using , {, y( p" h) P" X+ Cvectorizing algorithms that take advantage of this design. Vectorizati8 A: r$ L' q* R, m0 {3 L
on means converting' n+ N* z8 v6 R# ?* l* a3 b |
for and while loops to equivalent vector or matrix operations.”。改进2 k: p% ]% t9 x7 ?2 t3 Q; b( s* F
这样的状况有两种方法: ) M$ c+ }$ v+ |* ]: I* D/ r0 W3 F) R: M
a、尽量用向量化的运算来代替循环操作。如将下面的程序:+ `% P' U" L# C q4 a; I
2 ^# v( h% Z2 y1 P7 B' k
i=0; 1 A; p# h# i9 N' @; ?for t = 0:.01:106 w! S2 s; U' r
i = i+1;/ g3 H& j( M7 Q. Z2 b( W
y(i) = sin(t); 4 j) m4 J4 d) f3 q! e8 t1 K9 [end3 r' `! s: v2 R) A8 m; V9 ?! l
替换为:, t/ u T8 i. j! Z r
t = 0:.01:10; 3 G6 `# } S) D( G% |y = sin(t); # `& F( L) G( n: _' @速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i , _- _# }- m7 K" }+ \) [! Dpermute、permute、* K5 p+ W& F) S- e
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums 9 t% ~. }4 O- J5 E+ P5 }# zum、ind2sub、3 L+ z' w2 E) y' E; @& o, N
ndgrid、repmat、sort、sum 等。% m7 `, c# G6 f5 r# o4 \
& I- B- W" r4 X9 ~! c) X
请注意matlan文档中还有这样一句补充:“Before taking the time to 8 Z2 P# O+ A6 s# a! J$ U0 c0 ? 2 I$ k Q3 w" }0 U) nvectorize your code, read the section on Performance Acceleration. 9 U, b' I" |' H) ^5 y5 l- SYou may be able to7 j% R6 D5 e; r2 O- O7 V, t
speed up your program by just as much using the MATLAB JIT Accelera2 N* Z6 k. S, Z0 P* _7 A6 \% r
tor instead of! Q8 p4 H: q2 I2 l& S
vectorizing.”。何去何从,自己把握。2 y6 U$ a! J: T
/ @) G+ l5 s, j7 B* Q; A8 v
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 h% P* P$ t5 h. B- T' s( `" V$ z行循环次数少的,* Z6 \9 x: }; V$ d8 c' c
内环执行循环次数多的。这样可以显著提高速度。/ O6 g( P4 {- K3 U$ D9 T
' ?5 z; G& \* T5 E
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on u. N7 o; {, m* B. \# T
es、cell、struct、3 q9 n+ c" S4 q7 S {! Q6 M
repmat等。 8 h Y% ~2 r: Ab、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 P7 p7 f" Q0 n% |
6 G0 y3 c K9 g9 H/ z. y
A = int8(zeros(100)); ; z8 V* G- r# o) u! d换成: / h# X- Y' S" D$ s. I( {A = repmat(int8(0), 100, 100); " D a, y" v# kc、当需要扩充一个变量的大小、维数时使用repmat函数。9 |, F c& H: x$ g' A
4 L" ~0 _. a5 h# { ]3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 $ Y, Y1 W. u5 r& b: ab、使用Functions而不是Scripts 。( k* a0 I1 y% z$ p8 v; E