本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
: R) w1 }- V! W- g# n! R" C4 K4 Y5 V1 W3 A# |% M
加速matlab运行的三重境界 加速matlab运行的三重境界% V$ B! W+ I( c! K& c3 F u
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 _+ I% o: V+ @ a; L3 G%%%%%%%%%%%%%%%%%%%%%%%
5 Q! e: z% J2 E- _( ]$ u, S* H; H一、 遵守Performance Acceleration的规则5 P2 W k: |3 }- j, [! t
二、 遵守三条规则
( [% e% C7 d; x# T4 h, B/ g6 s三、 绝招
4 i) s$ H3 N) D$ M2 f7 v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% G) G: a; y" \2 Q
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则4 I0 o% _$ x" v; E; q6 i
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将; U& ~) e1 ^' d" k
其规则总结如下7条:
: N4 H: e$ R: L1、只有使用以下数据类型,matlab才会对其加速:
: l! z. m2 o/ [logical,char,int8,uint8,int16,uint16,int32,uint32,double
f' h8 L! o2 O0 x8 i而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu7 U/ D2 `6 d1 j/ y N' c8 R
re,single,
! a5 e+ {% V5 X6 Y; [# E% Mfunction handle,java classes,user classes,int64,uint64" L6 z. k" f M- T: ]/ ?
2、matlab不会对超过三维的数组进行加速。
# [( M6 c( i# V8 j/ Z" M- v5 v3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值; O$ u0 T. {+ B! c, e& J# V9 e
来表示;
# K( z5 D% w3 G% m& w. ~) t) Vb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数' |- f, o% z* l) f4 n. ^
据类型,只使用
) I/ S% W5 E; W" A' Y% ?三维以下的数组;c、循环内只调用了内建函数(build-in function)。
4 ?0 M+ L; M* J- u% ~! s4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
& D- t1 n+ s% d$ b" l1 W加速运行。$ X1 z& P4 Y& b; R) B2 A2 i+ b
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:9 c1 ^9 g0 |/ O) R1 ~. S
x = a.name; for k=1:10000, sin(A(k)), end;
, D' W7 ~* {; p6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速' s1 K" D5 G' R1 f) m8 i( d
度。! b0 {( f! S4 \( C
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
$ Q: D' _2 g9 a8 R9 o0 {运行速度。
, j1 [5 Q" o$ D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%( U( y6 B8 t0 l& j A( l
%%%%%%%%%%%%%%%%%%%%%%%$ ?/ u+ s7 V& z1 O: Y1 Z; T2 p
二、 遵守三条规则
- h$ W8 S; S5 E: m1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
* A) j( v8 L* x9 U yh means it is designed* K% ^- n% L# X1 ?" J
for vector and matrix operations. You can often speed up your M-file c
. h# L8 x2 ^- `* u) u4 Mode by using
9 J$ r( M* {$ s1 Dvectorizing algorithms that take advantage of this design. Vectorizati+ p+ @& l5 z4 g; K7 X( Q
on means converting
2 d5 f/ x- D5 w8 Qfor and while loops to equivalent vector or matrix operations.”。改进
. a9 d. c/ @# D# h这样的状况有两种方法:
t2 ? i" B7 l! S! G, W2 Ca、尽量用向量化的运算来代替循环操作。如将下面的程序:% [2 s3 v0 H3 o/ G m
i=0;0 T* `" v* g- e& @, z$ o
for t = 0:.01:10* d& X; _2 `! Q t7 A6 y) l
i = i+1;
: ^' S0 I6 E t [4 c+ Vy(i) = sin(t);6 G4 B7 {9 M& Q
end
" ~1 j2 w+ u: K$ d( j替换为:1 Y p' {1 d' |" o$ D
t = 0:.01:10; R& W! s7 v+ u5 j( r- p
y = sin(t);
# n) ~& _! {( Z* E- U5 F速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
1 e8 }% I$ i& f$ w, @. epermute、permute、( z1 W* _9 t. R- ^
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums4 S: P }) c+ Q
um、ind2sub、
1 z F0 b% `1 C$ v& ^5 Z7 Dndgrid、repmat、sort、sum 等。( E) L! F# x* R0 I5 O5 R% L) S/ Z
请注意matlan文档中还有这样一句补充:“Before taking the time to: g: L) o1 Z, a, o) K& O3 q+ p
vectorize your code, read the section on Performance Acceleration.
/ S7 _2 D6 d/ D; p" a" @You may be able to
+ f6 Y, r1 g3 f. vspeed up your program by just as much using the MATLAB JIT Accelera6 M% c8 ]4 G5 k
tor instead of, i M+ X* C0 M) D" b9 U+ Z3 C+ _
vectorizing.”。何去何从,自己把握。1 P& W. V, C6 }: c& D' R2 i1 P) u# J+ F
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
6 D8 Z" [8 ]' M4 R$ J. Y7 b行循环次数少的,) L+ q$ B% Y: A+ O! B
内环执行循环次数多的。这样可以显著提高速度。
3 k( z5 _5 L8 R/ U$ r2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on+ J. c" e% P3 [! T9 w( U
es、cell、struct、. B+ w7 J% ?7 `- A1 s/ P, r' V
repmat等。: \! z' s) N% d# o* M
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:& z" V. s4 e! U, T- @# j4 H/ F
A = int8(zeros(100));0 U- f0 b! d$ Q' I
换成:
' H0 u6 \# f2 Q, SA = repmat(int8(0), 100, 100);
" _9 ^8 h* q" Nc、当需要扩充一个变量的大小、维数时使用repmat函数。
5 F+ k: M" D; m' T3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
# X) d) n& z: _7 l5 xb、使用Functions而不是Scripts 。. I( v! _* N6 g$ P% E! B; ~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! C; N o v4 t& c%%%%%%%%%%%%%%%%%%%%%%%
9 i, ]4 @. y2 v" a! L5 |三、 绝招4 x; d6 X+ L+ }- |3 s: a$ Y
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。1 N4 D2 z" Z4 I3 P2 B0 W; N9 P' y
1、改用更有效的算法
, I- {6 N6 V. h2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 3 R$ |# R0 ^9 n4 z% K# t
2 C% j) X0 \) |
来源:iLoveMatlab
( s1 ^0 p9 F, Z' F
" c; Y) ?: D4 B9 m7 B
) K/ f, D& f, ]% `在这里本人推荐使用‘绝招’。 |