本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
! K) h) s& i$ o+ E! q6 R: V& H6 Y6 t4 V8 q N9 F7 w; Q( s
加速matlab运行的三重境界 加速matlab运行的三重境界
# f1 @7 f( x5 q+ ?7 h/ B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ V) x( L# }! f/ F8 B
%%%%%%%%%%%%%%%%%%%%%%%
/ j& q* a% ~$ Z' E* G7 J+ S( O0 K一、 遵守Performance Acceleration的规则% M o& C8 m/ E" M! l
二、 遵守三条规则/ J( L2 ]2 E. h8 z8 {
三、 绝招
o$ s( t! b/ o& l: y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( G) [. s- m- P% M) x6 O+ ?%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则
; u6 D% n" u, ^* Z/ F' F关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
* S% M( k9 |4 o# w7 S其规则总结如下7条:
$ W8 L" ^% ^) [. ?9 }5 z1、只有使用以下数据类型,matlab才会对其加速:
+ c/ t- c1 \! nlogical,char,int8,uint8,int16,uint16,int32,uint32,double
0 X- I/ s1 ]& c而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
6 S X" Q* |" F/ w, A3 ore,single,& M4 W' Q2 j, Z+ m
function handle,java classes,user classes,int64,uint64( F9 F1 \ [% U* {! t, d2 S5 C
2、matlab不会对超过三维的数组进行加速。
0 }5 F& K1 ]2 P* V- W3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值( v$ W7 K8 k% ?7 k# R) w" |
来表示;* W. i/ W+ N5 D* k( j- K. K
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数9 \0 h( b+ W" x+ j2 `+ d
据类型,只使用
& j. k( c: x7 m1 B; Z. v7 @0 ~. g0 i三维以下的数组;c、循环内只调用了内建函数(build-in function)。
* f& Z( [, x+ S5 }7 a2 p4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
7 L; x' q6 `$ T加速运行。
7 Y* {% f+ @9 q: H5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:" M, |0 C/ ~- ~: @ N
x = a.name; for k=1:10000, sin(A(k)), end;
7 j, @+ y0 h6 E. O- c( E6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
w8 u) D) w! Z0 m度。9 z. a- a$ b+ c: H$ K! Y. b
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低1 r1 f, Y& e- p& q9 g( D
运行速度。
7 v4 I' }# C8 E% ^" a$ h: V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 ~) o; w* O- ?+ I1 Y1 C, b
%%%%%%%%%%%%%%%%%%%%%%%
9 ?6 h! T9 f6 J( F8 }! W2 ~. f二、 遵守三条规则' T7 [. v8 Q, M8 O$ I
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
7 _* T3 T# z& nh means it is designed5 C& d* _* o/ ~. I4 i6 E0 }
for vector and matrix operations. You can often speed up your M-file c
* u2 r' k# m7 M. o5 S' vode by using
9 C0 ^2 J% H; ^% v. C2 R6 ^- }/ qvectorizing algorithms that take advantage of this design. Vectorizati
: X4 e, {, `# N6 Q+ \on means converting7 h) k- s/ j" _8 _! V
for and while loops to equivalent vector or matrix operations.”。改进0 p' ^+ k- |. Y
这样的状况有两种方法:
9 `& n) P; C4 U% B" N: I) Z# T5 za、尽量用向量化的运算来代替循环操作。如将下面的程序:8 {+ Z- d' Z* @$ u
i=0;
3 A) b. y9 X9 `: Zfor t = 0:.01:10
" L6 o- F2 h* q' _2 p1 ~i = i+1;1 N A+ a# C) C
y(i) = sin(t);& ?5 e* h; l5 S% ~, }3 M+ b
end* F0 @8 r6 i5 G4 f; z" @* ?# ?
替换为:" s9 g/ m# g1 M) f _
t = 0:.01:10;$ W% h1 M% s- Y. _# y
y = sin(t);
G) a) c+ p9 K7 Z! t# R速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
0 [( h2 l' q% O+ k, hpermute、permute、
3 \0 A4 F- z2 D. Sreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums$ n0 v. F) o2 o
um、ind2sub、
; ]. x. O& v- j4 pndgrid、repmat、sort、sum 等。
8 ~. r, n: H! A5 A/ X- _ n请注意matlan文档中还有这样一句补充:“Before taking the time to
/ w& x3 [" H- o" _vectorize your code, read the section on Performance Acceleration.
% m( x& S" Y$ _" SYou may be able to
3 T9 k1 ]1 w4 u( zspeed up your program by just as much using the MATLAB JIT Accelera' z0 h( w; s$ V6 C
tor instead of& @: G9 I! z f0 Y
vectorizing.”。何去何从,自己把握。
. r) T2 S0 G# N. D5 [b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执+ n4 D; d& A' A+ v* G( @: w8 \9 @
行循环次数少的,! c0 x; ]2 }- O1 G& l2 F( k
内环执行循环次数多的。这样可以显著提高速度。
3 r8 w7 K( S7 n: p8 _2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
& b/ j( J6 e3 r' t. qes、cell、struct、/ T4 }) P8 Y/ N' I3 l$ p$ u' T
repmat等。3 C. G1 Y8 f' [$ V* ^
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
/ d3 ~6 U, ?# F/ [9 I# B$ fA = int8(zeros(100));
9 K( \% r8 ` _# ?) @: I换成:
- e- `; i+ `/ p& }A = repmat(int8(0), 100, 100);
: g* v7 W" c6 Nc、当需要扩充一个变量的大小、维数时使用repmat函数。
4 k: u$ M/ } m O. L: N3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。) x9 t4 b4 @1 X J3 O
b、使用Functions而不是Scripts 。
6 J' g* ^- r, X7 C* R%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 e3 N: Y+ o, J7 k) q
%%%%%%%%%%%%%%%%%%%%%%%2 j3 X H/ V, s
三、 绝招
9 Z# \* r% P/ e9 I% B+ x" T你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。0 g) N+ }8 a1 Z
1、改用更有效的算法
- { Q1 A' i, e5 N! D2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
, t3 x( W( j" ^( w5 G: t' m
- c4 }. u. T" Y- l, l9 k* E 来源:iLoveMatlab R2 _. v& P+ F! N4 k
+ v, b, l& H8 S% S9 p
6 i ?# {' H' w' p& v y6 k+ K' |在这里本人推荐使用‘绝招’。 |