本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑 3 ]. O5 w+ R+ m+ H( i" Y
( k3 `, R& I5 L5 c, W$ k$ Q1 G
加速matlab运行的三重境界 加速matlab运行的三重境界2 }& X( X! f8 N H6 ~, P
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 M% O9 F5 G1 }%%%%%%%%%%%%%%%%%%%%%%%
& L6 a; W8 L! m1 J一、 遵守Performance Acceleration的规则9 @, a3 O8 l- i- g. [! v7 I# C
二、 遵守三条规则) @1 k+ k7 \' _
三、 绝招8 ~. ]3 u9 t& g* L
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' W P( R$ `# L! A
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则1 m: C+ V, z8 [% z }
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将, X/ t; }' J5 [) d% { p
其规则总结如下7条:
4 v+ P% ~ \/ g& z6 j* u g6 P: D* w$ ?1、只有使用以下数据类型,matlab才会对其加速:4 H* X$ ~8 a% {: K3 z6 Z
logical,char,int8,uint8,int16,uint16,int32,uint32,double7 L8 W7 r- T% _, W$ O7 M3 h8 w
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
" a( N: F$ x2 p: d+ ^* P4 s0 N1 W6 Kre,single,
/ u% v7 V. [6 ~! r E6 H- F: Q( d& Hfunction handle,java classes,user classes,int64,uint646 a ?, O% v- w7 @: @
2、matlab不会对超过三维的数组进行加速。% V* I1 Z% \9 d! B; h/ b
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值% C" Z9 K0 _4 Q& A+ o
来表示;3 ~2 j( v5 s! V: s
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
3 \: u" \, A0 ]4 O- |" \据类型,只使用9 I. S3 u b4 ]' \- X1 G' P& z# L" K$ s
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
" O. I' g9 p$ l8 Q. Y' f% i4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将5 v8 W; e& W3 H, j' {3 u2 P
加速运行。
6 d7 k+ ^/ U; h* @& c$ A/ S5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
9 c6 l4 M- e3 n/ I3 ]" f, @) r5 V$ D7 jx = a.name; for k=1:10000, sin(A(k)), end;
~% \' D, s" m; n; X6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
/ A/ D: b, S( H" N- B8 o% J8 i/ E# Z2 C2 C度。
6 D$ t) b4 {$ i2 C7 x7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低; j! o) D. Z+ W* }& |' t
运行速度。3 v+ a# Q1 C; K8 I6 ]3 d
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 t' }. k7 B0 @: R! N8 J4 r%%%%%%%%%%%%%%%%%%%%%%%- Q# N- M5 M1 I q! Z
二、 遵守三条规则# X4 ^" P/ n- j1 i4 `( _3 @5 ^
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
! @# j) n# P4 xh means it is designed
5 l+ ^7 y a! i/ u- Z3 V" _3 ifor vector and matrix operations. You can often speed up your M-file c9 b# n, j3 |! ?+ a% s
ode by using4 N1 M Z. F9 D
vectorizing algorithms that take advantage of this design. Vectorizati. ^, [, }1 ?% \$ X: W
on means converting' q6 B" l' u/ S5 ]
for and while loops to equivalent vector or matrix operations.”。改进! z/ d% l1 a% c, y2 w
这样的状况有两种方法:
$ {& ^; n8 T0 z# z4 l0 Ra、尽量用向量化的运算来代替循环操作。如将下面的程序:
& o# l9 v$ h0 u$ n+ mi=0;2 [- U4 D+ [* g d, k# s- E$ x* X
for t = 0:.01:10
; J, t4 t+ I; Ci = i+1;& P: @: `* F# X# `( t9 O v2 [
y(i) = sin(t);; o* |# h* q' K( U6 P
end
# }% W0 h4 L7 }) y2 B2 N+ | r替换为:" }/ l! j$ l: F @$ _- q
t = 0:.01:10;! ~" D, P2 y, {$ |$ u+ J* } B: R
y = sin(t);
2 ?5 W7 D( x! r7 z) `& ~+ u& q速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
7 M3 \8 h" V7 K( Y3 S' `permute、permute、% ^+ ]9 c1 n7 S1 s. R# t. P
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
T, x& u5 M# s! r. num、ind2sub、; i) T' M* ]$ }7 G% r/ j: q4 h3 G
ndgrid、repmat、sort、sum 等。
4 I, ^6 |2 Z! e, v请注意matlan文档中还有这样一句补充:“Before taking the time to
4 g6 w o7 W: K: g. ^vectorize your code, read the section on Performance Acceleration.
5 K& |0 v0 V! ~9 VYou may be able to7 ~* J' b5 G: K% u; g4 ]: D; E
speed up your program by just as much using the MATLAB JIT Accelera9 Q/ O+ }3 N9 Q
tor instead of+ u5 [( f' }( S' {1 x
vectorizing.”。何去何从,自己把握。) e/ {& \. G, o9 P0 K5 f
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
* N$ g0 `7 S8 n& I行循环次数少的,, ]* C8 F- n# o& h) W7 _6 S
内环执行循环次数多的。这样可以显著提高速度。
" H8 o: `( U! L* m$ n1 p; q5 L2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
) C( N2 r% q! w9 N2 r3 c( G* zes、cell、struct、1 ^ j% t" ]/ s* F$ I
repmat等。
3 U$ j% R* |! b; Q: Z+ Y; Q J7 Bb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
% L: p& R9 V6 C" B% r- wA = int8(zeros(100));
: |: S+ ^6 ]+ r, n" a换成:
8 a+ M% s9 ~9 b vA = repmat(int8(0), 100, 100);
9 u7 g! n5 m) n7 u! b. [/ y! m* dc、当需要扩充一个变量的大小、维数时使用repmat函数。
* r: Q% P1 @, W4 p" Y3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
; r8 H, _( ?2 R+ B& \4 E9 }+ Hb、使用Functions而不是Scripts 。
) T4 g4 q% r& ^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 y% M/ L" z, L" P! g
%%%%%%%%%%%%%%%%%%%%%%%7 E% [5 [# K( e8 W( |/ c# P
三、 绝招/ O3 j* s' p8 H) c8 v
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
! v, i) f: Q7 k. b1、改用更有效的算法! J+ b6 E: I0 _9 S) L% N# j
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
6 e6 K& y/ ~5 p" h9 q
5 ~" G2 u/ ~( ^# Q 来源:iLoveMatlab
$ e4 t( K; |& F) o
% K; n+ y I# a/ e. H
( S1 u' ] M" _0 r- F在这里本人推荐使用‘绝招’。 |