本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
: y H* x+ V6 w; k3 b4 M7 ]& _; R4 w8 `3 D, M( z5 F
加速matlab运行的三重境界 加速matlab运行的三重境界2 l+ e3 L! z5 p. ~2 V7 b0 Z: Z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%* ]% Z; _2 f" R
%%%%%%%%%%%%%%%%%%%%%%%$ q( _4 K2 p( L( n
一、 遵守Performance Acceleration的规则
1 @" ^2 B6 b% W二、 遵守三条规则
, d0 t, K- Y) ~0 w5 a+ O3 H8 F# D+ K三、 绝招
+ S& u) q l! s7 A1 r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 a! d3 E, [* a3 L2 r# q' q
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则2 K _4 L; ^' C
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将. W8 _( U# G# p2 b3 @
其规则总结如下7条:) ? Y Y0 q( _' I- U3 z# s5 E
1、只有使用以下数据类型,matlab才会对其加速:
0 z. J( W E- \! wlogical,char,int8,uint8,int16,uint16,int32,uint32,double
/ K4 ]- V/ r3 z: g0 m而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
& i+ V, X5 X t% Fre,single,
8 _0 i4 |5 D9 X$ e4 Sfunction handle,java classes,user classes,int64,uint64
r6 K5 e$ R% y2 P/ L8 a# t& d, Q2、matlab不会对超过三维的数组进行加速。
: |( P1 g( ?- d! H3 A" d3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值+ b. p% B$ [- h, W2 s
来表示;
/ `% D9 E, O1 w: N2 H, z, F. zb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
( }5 c. ~9 h0 `0 g据类型,只使用
9 S' ?% b# Z) P2 b; Q三维以下的数组;c、循环内只调用了内建函数(build-in function)。% D' [+ q3 I- }/ Z4 u8 I
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
! s+ C- C3 K R4 f& G5 W& W. ^加速运行。7 H9 ~- t) U2 c2 c( e1 a+ ]7 ~
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: B- w! Y [( X! M" i! @0 `
x = a.name; for k=1:10000, sin(A(k)), end;
4 w4 H* m6 ]9 V9 a! ^ S6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
& {8 J$ Z9 {8 w% H$ F度。 v8 j7 y1 r5 H2 P2 Y! Q: s+ f
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低6 |( K. @3 U7 x G
运行速度。, l3 B6 z8 u Z4 X: F6 h
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 x0 e. `" h5 o' e& X q
%%%%%%%%%%%%%%%%%%%%%%%2 s; {" j6 ~: H6 |& m- x! f- h; ^) I6 z
二、 遵守三条规则+ h0 ?2 Y, r' F0 Z1 [" B+ n
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic8 }2 Y/ g& ?. H; H
h means it is designed
: X6 J" b; Q" a/ J: @# }" lfor vector and matrix operations. You can often speed up your M-file c+ t0 q8 ?# o" t$ @; b
ode by using
) ]7 a* z2 S. B$ x; Cvectorizing algorithms that take advantage of this design. Vectorizati' t; X% m& w1 E t
on means converting
1 @5 |* q( ~" Ffor and while loops to equivalent vector or matrix operations.”。改进 \8 w- ~9 I, }" O
这样的状况有两种方法:
. r* ~: ~1 F" ra、尽量用向量化的运算来代替循环操作。如将下面的程序:
- h5 m H4 K; D3 L6 Ei=0;) V2 j6 U! s/ P/ {2 S
for t = 0:.01:10* U; r8 n o, W' k1 J5 O- n4 d' u
i = i+1;" t5 @# a3 O' `8 L
y(i) = sin(t);0 p. O+ t& g# t
end
: [, P/ X( g$ }" ~ F$ g替换为:
: X# Q2 S1 I3 g* {5 s. Ut = 0:.01:10;3 U3 D" X7 `% U
y = sin(t);; f) R) z3 W# t/ ~" f! h$ V: ` T
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
' m5 U4 v! N( D: i8 T0 spermute、permute、! L7 a7 j5 f4 }, O2 G6 @! I( a8 x
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums% Z' ]) V8 E& @: J( {4 t
um、ind2sub、
2 ]0 w% ^& W- n3 H/ y) u' u( Jndgrid、repmat、sort、sum 等。
4 S. b. g: B! a5 H请注意matlan文档中还有这样一句补充:“Before taking the time to
6 f; B [' `/ e, r/ @# Cvectorize your code, read the section on Performance Acceleration. U8 `! F3 ~& z$ e. ~
You may be able to
2 w# R1 Q7 Z$ L1 Y( j& vspeed up your program by just as much using the MATLAB JIT Accelera
9 @& ?8 Q1 z3 x$ ?( \ m* z2 l, ytor instead of J2 c. u/ P- u6 B, B( b
vectorizing.”。何去何从,自己把握。
. Q7 y! r5 o- h# `b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
* ]$ A8 Y/ D, ~5 I8 m$ u行循环次数少的,
3 }: M; y: r# ^! Z内环执行循环次数多的。这样可以显著提高速度。' X1 @4 g) t, `
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
* ~3 X& g: Q g X& C) l. `, }es、cell、struct、
) K+ w( P" Y# _1 H, jrepmat等。- S; \$ [7 N+ i5 U
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
6 ]" D6 N3 r( x9 [# @5 c$ N8 cA = int8(zeros(100));
3 E! J" C9 n* k/ L5 w/ A* ~换成:
7 F8 E( p0 ^3 j/ Q: EA = repmat(int8(0), 100, 100);6 y3 g, z; p L% `. j
c、当需要扩充一个变量的大小、维数时使用repmat函数。4 K6 r$ o* |% |) B4 |* W
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。- h. s6 m, W# w P* V
b、使用Functions而不是Scripts 。
; k7 v3 E- U' N- T' f' c: j6 U%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 C2 M J! W, v' ~6 g5 f* ^
%%%%%%%%%%%%%%%%%%%%%%%
. t! @3 @( W* k$ G' l# P# c三、 绝招8 L! O5 C. V3 W
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
1 F/ z' L9 m" B* q( v& d1、改用更有效的算法% ?/ X( z4 \$ s! ]% C
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
2 \ d' T$ m! H: ^0 V {" C
2 V+ M Q& i& S' @) n7 m 来源:iLoveMatlab
# l# E/ {( n4 }7 \3 k1 n* J+ c! e
6 `0 p! |$ g1 V" T- R& H
在这里本人推荐使用‘绝招’。 |