本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
! P, k& d) P. e( t* O4 ^% u6 ?; B; ^. D% z
加速matlab运行的三重境界 加速matlab运行的三重境界' W4 O' \7 h& J7 z3 X# I( `9 h& l
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$ j, _+ Z% K! v2 u2 Y
%%%%%%%%%%%%%%%%%%%%%%%* @; Z+ C) u) \: I- m s
一、 遵守Performance Acceleration的规则
4 N4 [0 C8 [1 G7 y/ \5 s二、 遵守三条规则
% K0 _; {" J( ~, o% ^3 g2 `+ W三、 绝招6 O8 x) Y- Y3 h% q/ T" Z: n+ J! q
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) E* @, K: G* x9 C1 w( |' n
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则
) q+ x4 f) o) W( K q1 B" L. Z关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
X3 J& x+ ?- i! A" _5 ~6 u$ F4 T其规则总结如下7条:
5 c/ N0 t8 q& o, N4 j- ^; |2 s1、只有使用以下数据类型,matlab才会对其加速:
2 T' f; j5 R+ J0 S- Blogical,char,int8,uint8,int16,uint16,int32,uint32,double
* `( L4 o0 ~' V. k F而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu! S+ I9 n+ A, c% Q* J6 d
re,single,' |' |( f* Q2 K
function handle,java classes,user classes,int64,uint64, O1 j/ }8 A3 d7 {1 ?' C- \0 o
2、matlab不会对超过三维的数组进行加速。
& x: |$ D2 w1 c" L3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
! m" M) b' y i" T' r6 Y& T来表示;
" ~$ ?" c0 @, O: m3 Ab、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
4 }5 V7 W; N3 Q( y5 T据类型,只使用5 ~# A4 z1 A! b0 L/ h, j
三维以下的数组;c、循环内只调用了内建函数(build-in function)。6 x+ p: y# I9 Q( G) n7 V
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将% g$ j) W d! C# C2 ]% N! G$ ? n
加速运行。
- K% j5 ~- F6 }0 Y5 J3 M6 ?5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:( O" O& |7 {% R4 c) g! f% L
x = a.name; for k=1:10000, sin(A(k)), end;' f g [7 N& Y
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
; I0 l/ ?1 \' t+ I/ @( H度。
+ g0 } {- o$ o) n0 X3 c) u9 d7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
6 E K% Q) z! ~4 I& i7 m运行速度。/ Q+ f* {: q& t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* z+ F0 r3 U! T, Z! i
%%%%%%%%%%%%%%%%%%%%%%%; D+ d0 H6 m; Q; d" q
二、 遵守三条规则
~* ^ t9 F7 u' H1 A2 n1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
y& c/ m+ @5 {8 d3 F- kh means it is designed& i$ i ]1 o2 ~$ b# R
for vector and matrix operations. You can often speed up your M-file c8 J* E5 E0 Z: n( H5 {" [2 b! I
ode by using0 x3 f7 g) [% V, @7 D; H1 o/ G( W0 I
vectorizing algorithms that take advantage of this design. Vectorizati( r2 }# y( I2 e/ {% \, I/ }
on means converting8 w# w; _/ v0 q- L0 w
for and while loops to equivalent vector or matrix operations.”。改进
: _: O# y4 Z4 V1 }. e- K5 Y8 Z这样的状况有两种方法:5 @5 T) T0 ^6 s7 o {
a、尽量用向量化的运算来代替循环操作。如将下面的程序:! Z1 r" e* r; o0 I: `
i=0; P9 Y* m5 W$ T# T+ k* l! |
for t = 0:.01:10
- q3 B2 S6 E" a& J Q" Qi = i+1;
+ l( q+ X9 h# x/ x* l. e' By(i) = sin(t);
5 ?" ^$ O. v7 Bend1 u3 u2 s6 }+ J% h3 D1 z- b
替换为:4 [' B) w! L% |" U
t = 0:.01:10; R6 \( v6 Y# c n5 E
y = sin(t);
& A8 [5 ~3 j$ n' R4 \/ I速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i' O3 e6 d; h8 J9 B- Y5 \
permute、permute、+ r) s8 G' z: T( K
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
0 V P3 R$ J3 ^7 e$ K& ~# _1 _um、ind2sub、# u" k; j; z! {- y* y2 b$ X: G4 d
ndgrid、repmat、sort、sum 等。& f4 d) L% _2 v, a1 ^5 [/ k
请注意matlan文档中还有这样一句补充:“Before taking the time to, d, W0 ]. J" U" o
vectorize your code, read the section on Performance Acceleration.
# ^4 |4 _' B# j2 oYou may be able to
$ k _' E9 ?" N& u5 N! S. \3 Gspeed up your program by just as much using the MATLAB JIT Accelera$ g# P( _) f9 o. ~ _
tor instead of
* c6 l: E: A" x# u. u9 c- Z5 s8 Uvectorizing.”。何去何从,自己把握。9 ~: |0 f" {% v/ g M7 ?9 W
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
" j) a* S9 `" t1 F$ B! | R行循环次数少的,' v+ }9 w* k( n P o" I/ L$ V
内环执行循环次数多的。这样可以显著提高速度。+ n: K; |& p' e! l
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on5 X' `0 K, Q5 Q1 @+ c
es、cell、struct、
1 E9 g: n$ C% m, q9 Crepmat等。
+ `$ N, I, t5 }0 F& R- ab、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:, [& @( D2 a- A% t5 L0 M7 F
A = int8(zeros(100));6 ~/ T4 R, D9 l. c0 k
换成:- U# k+ U& J$ O+ P; w) E! T
A = repmat(int8(0), 100, 100);8 q {6 j; U+ \* G+ }
c、当需要扩充一个变量的大小、维数时使用repmat函数。+ F. D: h9 i$ n2 D2 L
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。# b, Z. i a3 l7 Q# a. q
b、使用Functions而不是Scripts 。
- Q) P* G/ a* p5 h%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* I) g( K' X+ J* }8 B%%%%%%%%%%%%%%%%%%%%%%%
{0 K7 l6 {! V+ H+ }三、 绝招8 k# x4 S4 P6 I& [
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。7 _1 @ ~% u! G' a( B3 W- l4 v
1、改用更有效的算法+ D7 w& e: o* ?& K1 Z* J# }
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 ' t6 |; ~; A2 K2 z9 g. `' s4 H
4 @ f/ w) b3 l& o( D* Z2 n( X 来源:iLoveMatlab$ x( o5 ]9 K5 p3 r/ o- n
! K. O. n2 q3 x( n
( e) x0 P, R5 c' M0 G2 s
在这里本人推荐使用‘绝招’。 |