|
非常实用的Matlab编程技巧。可以试一试。
7 i. m3 o! ^- i5 o T8 V+ E5 B1 rCTerm下载文章: 紫丁香★' j6 P# A3 A6 O& K. E
; {0 ?% a0 O$ G [, {4 {! d
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
2 h. Z9 F" t% |标 题: 加速matlab运行的三重境界
1 U" _; c, [( H+ b5 |- o发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
5 X# _1 [1 X0 N. m4 b: C* V
: w, k5 g) }& ^5 ~9 g. r. x1 F加速matlab运行的三重境界
5 T+ K$ \5 q: D1 J6 q4 R/ H一、 遵守Performance Acceleration的规则0 N5 i6 ^4 c* ?2 }
二、 遵守三条规则) E0 f/ H" e, j
三、 绝招
# X- N1 K, G _8 k) [% ?一、 遵守Performance Acceleration的规则
7 B: ]6 z4 k1 j( i/ U
% C5 Z9 O. U2 v+ p5 u5 K" e关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
3 E4 k5 f0 P7 t+ G& ?4 T其规则总结如下7条:
/ Z9 ]1 R: _, `5 X1、只有使用以下数据类型,matlab才会对其加速:
& a" {* J. i6 o% o. D' x! J9 N6 V2 ^logical,char,int8,uint8,int16,uint16,int32,uint32,double: i& c* V% w) a4 m E3 a- X
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu4 x4 w" m( U1 @
re,single,
: N/ }/ B5 ?1 |+ e
: t9 z6 g% M9 j& b: d1 W4 Ifunction handle,java classes,user classes,int64,uint64
; V4 V+ \0 K" o2、matlab不会对超过三维的数组进行加速。$ N8 S- P! J: ~7 I8 s
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
: [: P+ M9 F% W. V( O/ b' s& h/ @来表示;
2 E, [# [5 G3 s% @! q1 ?$ sb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数+ e. O) V* K) B' m1 B
据类型,只使用6 D. j- A. i; B- q! R8 Q
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
3 \- d6 r! ]- E1 I0 C9 `5 O6 m% J: u8 ^4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
' Z; A; q" a$ g2 R: T6 i加速运行。: s' j7 |, W8 @" c$ J0 C
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:7 a5 J" O- \7 {" P
x = a.name; for k=1:10000, sin(A(k)), end;( h$ C; `1 V. [- {
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
% ~5 I4 f0 k+ \# z) w2 v r度。- ?! | X0 N& F& ]2 H n
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
/ ?" i1 H8 U' [% J$ ^0 C% T运行速度。0 }. Q: r6 `) w) m
3 [) M( N7 B) ~. O* ~3 a; G' l, \8 [! y M/ N# V1 ~
二、 遵守三条规则
8 `. R( n, W, |, a) [' `& n# L# ~2 M5 [) N7 j
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic* J" r, m( B$ r D
h means it is designed: q2 ^ j0 K2 m0 h
' `7 \+ K6 U2 s K) b( }for vector and matrix operations. You can often speed up your M-file c
7 \% j# f, X4 D: q/ @ode by using
0 S9 @7 e% _5 F% S3 k7 Zvectorizing algorithms that take advantage of this design. Vectorizati
5 G2 Y( l! P9 o/ u: h. eon means converting
3 N( X, t6 k, B8 i* nfor and while loops to equivalent vector or matrix operations.”。改进
: e1 C& d8 a9 T- V这样的状况有两种方法:2 {+ c# V- j- I$ R9 \6 w9 p
& R$ X. S) F: M
a、尽量用向量化的运算来代替循环操作。如将下面的程序:: ~/ g$ f% @* o; K8 o5 L
& e- w# j S1 S6 Z6 {' O# y u
i=0;
k& _4 w: b5 |, Dfor t = 0:.01:10- j3 I7 F( t' Y6 x3 K
i = i+1;0 S9 U4 g8 f' I. t3 s3 z5 _4 y2 w
y(i) = sin(t);
1 e R# j7 K0 L7 n7 K& x4 gend3 l) p+ {3 Q9 |! [& A* m& O! E
替换为:" ]7 P; h$ G" @5 t, ?+ i
t = 0:.01:10;
. k* G/ P, @# q' I: K/ A4 Iy = sin(t);
2 Z; e2 r2 z4 W速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i A( U4 X U: |0 [) j
permute、permute、, B/ G" k9 }0 l. s1 m2 u8 w9 S
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
' Y+ G: s5 A, h4 E1 |um、ind2sub、
J" c( W0 M6 \: E- Zndgrid、repmat、sort、sum 等。
3 Y1 Y$ Y$ b0 W. u; K$ Y7 I4 X/ s$ b! c# C! k. P
请注意matlan文档中还有这样一句补充:“Before taking the time to5 ?" ^7 v7 L; j O
$ }$ V( `2 o s* v. L& o# Svectorize your code, read the section on Performance Acceleration.6 d) M/ x6 x/ |7 b7 i7 c
You may be able to
( W1 w! T1 ], d4 w6 wspeed up your program by just as much using the MATLAB JIT Accelera
1 @) [8 R3 C5 ?9 f% W9 c0 h; ~tor instead of
! }- s5 M) a) jvectorizing.”。何去何从,自己把握。
1 `/ F; T1 h5 u2 |$ e+ \* ]; |, m" f, S6 ~7 T' B
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执' l! ~1 B) N4 m+ A
行循环次数少的,
& j* {. w) a) O% |2 N2 s内环执行循环次数多的。这样可以显著提高速度。
6 g1 h: [0 d5 U0 U- m# P) S* L
: @0 ^* \4 k" o ?6 i0 P2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
" M# g8 l! E# ^" xes、cell、struct、
" Z# Y1 A& j" ?repmat等。
! `7 g5 N( \( X) {% K* E0 n* Fb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:. m) y% L0 U) r; G% t6 ?& I0 n
2 p; D$ o$ U: G
A = int8(zeros(100));
+ d+ q( L, V' \0 h8 W, s$ [7 G换成:
/ ~! ~, k. g' WA = repmat(int8(0), 100, 100);
! v* S( L8 e+ `- qc、当需要扩充一个变量的大小、维数时使用repmat函数。8 c8 D7 d1 P& A
* n( u# I3 c, [/ {3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
; u: s! S4 Z2 Z, x0 t M4 Wb、使用Functions而不是Scripts 。
2 n8 b. y( i% U6 @7 i/ z- m$ d: H9 T z+ X0 q0 X
+ I, i0 v9 L' C* I
三、 绝招
6 y* Q# l. B% A1 ~7 v
/ E5 U: i3 F' v你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
2 } Z0 [) V5 W0 K7 \4 l V! e1、改用更有效的算法
' i1 A0 I" C, i1 r2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
6 D( z) U0 a5 H" R. S. N ]" Z, @% ?' H% R$ M! S3 W' u! W
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++3 z% w( W5 d4 S' O2 u
语言文件,VC编译”。 9 W! T7 Q7 I' b' `- U
|