本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
7 f! v D4 Y3 O0 n; h
- ?8 \1 H. ^; r `: N加速matlab运行的三重境界 加速matlab运行的三重境界" n0 |: c4 P0 z6 R7 q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 j& j$ Z `6 W3 P6 q. d
%%%%%%%%%%%%%%%%%%%%%%%
" Z/ a6 Q: S. j, k1 L2 A7 `1 l9 c一、 遵守Performance Acceleration的规则
3 x Q- O1 d6 j/ i' {3 a二、 遵守三条规则
1 x6 ^7 G. c1 c. `6 e0 b9 Y* \三、 绝招& R1 k4 ~- \( P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 R. b d( v/ ^' i L9 {- @
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则4 E% h) z8 a/ i8 ?
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
3 o' e" {' p, D. a( `, ?其规则总结如下7条:
# \% x8 t5 l2 U' M1、只有使用以下数据类型,matlab才会对其加速:. C8 g7 ]. E: u; N2 O' Q& l/ V* s2 z
logical,char,int8,uint8,int16,uint16,int32,uint32,double
( g! |: z% w$ Q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
( O9 z/ `! Q$ jre,single,; m$ W/ s# k4 k
function handle,java classes,user classes,int64,uint64/ s( i v' r9 T4 @8 B
2、matlab不会对超过三维的数组进行加速。* N$ ]- s s" v/ \% H+ ^/ i
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
. g* G% f5 q2 j j0 o) U来表示;, ~; t- X: S, L& S2 @
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数% U2 F) o' c9 Y* R H( C8 K g
据类型,只使用
4 Q% A# i) T" q) c6 z三维以下的数组;c、循环内只调用了内建函数(build-in function)。
# u1 _1 V0 [, t( q/ O3 M' z4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将0 L$ \0 w! o& C# f; v6 {1 c) D+ `
加速运行。
+ e! ^: y4 I+ `+ d* F! U5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:( m( C) f8 ^7 K, P6 x* X7 ~# ` H" k$ m
x = a.name; for k=1:10000, sin(A(k)), end;
; ], e0 t& _8 A2 E3 c9 t. E; y6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
0 {7 X y* k9 p/ S9 R度。# E6 D6 i* p4 w
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低: r. p2 f' u' w. `. @' x: \
运行速度。
: b: q1 S' r- o2 {6 E& n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ T- ]- x! x0 X3 b: g( k%%%%%%%%%%%%%%%%%%%%%%%$ Z. Z3 [% N9 n$ Q5 T3 f7 X5 }
二、 遵守三条规则
" ~/ S0 F% ^6 F/ K' R1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
) X5 g: M2 | D3 Oh means it is designed
9 t3 @/ _7 w8 X) Wfor vector and matrix operations. You can often speed up your M-file c
6 ^, Z; \5 g8 m# h+ `# C2 pode by using4 r2 H- p! W. z0 s) _; H
vectorizing algorithms that take advantage of this design. Vectorizati
; p' ~2 x5 H3 i5 Q7 \7 jon means converting
& `* M7 S; {, K/ @% Dfor and while loops to equivalent vector or matrix operations.”。改进1 i e7 W$ A, r' j. {, H
这样的状况有两种方法:7 Q: m2 d9 g5 O7 k) e! z: c
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
) C& _8 W: v: s. A$ \" j" }6 Ii=0;
6 l+ W& j; E* W. n! Ufor t = 0:.01:103 Q. i- \9 z) e
i = i+1;# ~( P+ f; ~1 O- m3 }; |( z. E/ |' i
y(i) = sin(t);
% X' m% S# Z7 V/ y8 pend( K9 ~, |- z# W6 N/ l& k6 t {- z( B
替换为:: t; h) a5 W7 A" Q0 w5 v
t = 0:.01:10;
* q f; t+ g, iy = sin(t);
7 W e9 R4 z3 P7 b8 ]: H0 `3 w速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i' g0 w% Y& [- ]% {' v1 l. }/ V
permute、permute、% j, o" [( j; w% M8 o4 \
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums: i2 j. s" H, {% E: r
um、ind2sub、& W8 Q( c' L! ~9 ?: V3 t# W2 s
ndgrid、repmat、sort、sum 等。
9 b' ]! S4 U* N* R6 ?请注意matlan文档中还有这样一句补充:“Before taking the time to; W9 {$ _+ m1 u! ?8 w% v9 ]
vectorize your code, read the section on Performance Acceleration.
# q$ T3 x) N8 `, P) PYou may be able to; ^- F) c4 {. f6 N: O
speed up your program by just as much using the MATLAB JIT Accelera
9 a4 i7 N4 y1 u, p9 a+ V+ `6 d2 ktor instead of
8 g4 D) B8 k0 |0 Q% t! v9 h' j5 u3 N' xvectorizing.”。何去何从,自己把握。
6 } D' F- R( F" Y5 G7 ]' U. f( e, |b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执6 G8 b8 c' [* F- d$ m. }' ]
行循环次数少的,
' R- r. }* C& X6 F0 l$ y内环执行循环次数多的。这样可以显著提高速度。
8 V' ?& c- [# D. P6 j: H$ d2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
5 R8 O/ P6 j3 r* K6 I! bes、cell、struct、' ^( q: b6 F! u6 x8 K
repmat等。) H% B' ^. e; h0 V: K
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
% w0 `/ z# c( W5 l* LA = int8(zeros(100));% G) i) X. S6 X2 ~! ]
换成:
5 ~, i% f+ G/ N V3 }' F0 _& e9 w6 e6 YA = repmat(int8(0), 100, 100);
* ?3 H8 j' }6 |5 _& zc、当需要扩充一个变量的大小、维数时使用repmat函数。# q7 u7 ?6 i9 v- p$ ^: W9 V
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
8 |, n" l" l( I# b# W/ |# t# Qb、使用Functions而不是Scripts 。
# S! m( ]5 D) Z7 E0 L0 S/ K%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# m0 B( _: |6 U
%%%%%%%%%%%%%%%%%%%%%%%
7 H) ]: v- E. r4 f. A三、 绝招) T% P0 D& k7 i4 u1 r, [ N' z5 I2 w
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。- \: e; j1 d, }4 z1 W }& Y
1、改用更有效的算法& _6 S: p$ p' A4 P; b! t
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
2 Q9 M( B$ L) j4 W
2 W( X7 d( v/ t4 j 来源:iLoveMatlab! I6 _! F! ~9 u' i0 b C) x2 S" t) P
8 \% W7 g+ F- p- | H z! |5 \. U2 M7 _* }2 J
在这里本人推荐使用‘绝招’。 |