本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑 $ l6 k$ w# A+ v$ t7 b& J
& R, Z& A% I3 h( l加速matlab运行的三重境界 加速matlab运行的三重境界
, G5 p( ?7 z! P' E! r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 ]' K3 s& \- d! v%%%%%%%%%%%%%%%%%%%%%%%& q& M% t: z* z9 h5 |7 N1 P& w
一、 遵守Performance Acceleration的规则, J! D T1 t! n" W5 X, D0 C7 i
二、 遵守三条规则
3 b' Y( `3 K+ ?: ~" G, D三、 绝招6 N S* j4 g: J: }6 W. _
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
p& j9 L8 ?1 l9 _; [. K8 N0 t%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则' H& E, }+ p' `+ Q
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将- S$ Z' ~% e ]1 E3 {. s
其规则总结如下7条:2 S/ ?! x, R* q( W9 E- s! Q- D6 b
1、只有使用以下数据类型,matlab才会对其加速:" S0 }! ^9 T/ {( n8 V2 s
logical,char,int8,uint8,int16,uint16,int32,uint32,double0 x- t5 P# u2 K {
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu$ [( O& b7 R7 h0 M6 R
re,single,
6 Y, K# Y. l$ [. n# f7 p- p" r9 vfunction handle,java classes,user classes,int64,uint64
. E. i1 f8 P# G. I A! K4 {( p( m- N2、matlab不会对超过三维的数组进行加速。
" a4 M4 F: S( ]' k) Y3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
& d8 t5 E- M& F2 T* }9 ^来表示;6 x% U: {/ f2 u
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
4 B+ m) f9 m+ f5 n8 S& X4 n$ {据类型,只使用! W2 @5 N& C3 ]2 y# ^
三维以下的数组;c、循环内只调用了内建函数(build-in function)。- N: h z+ p$ c; G# y
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
( }3 R+ C ~" }% t5 S* F加速运行。0 l0 D* {3 Y* `
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
' H0 M, O# _% v: Q+ F" U4 r( nx = a.name; for k=1:10000, sin(A(k)), end;( K* _' |2 j$ [; A1 t
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速4 O8 T- s& R! C& z4 x
度。1 G+ k7 z8 |7 }' y' w1 { x" E
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低, }5 n N+ W8 F) n( d8 b
运行速度。
* I0 T$ [. \- h%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 N: f8 v, v& }1 {3 I
%%%%%%%%%%%%%%%%%%%%%%%
* m7 L; [% c' Q. ]二、 遵守三条规则
1 d. v# g9 H- k- I! R2 B/ m. U4 \1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
9 G! M3 r: I1 m9 W/ X% F8 u" y# ph means it is designed
, d6 L* E/ I7 p7 x; T* p% {for vector and matrix operations. You can often speed up your M-file c
9 }3 ?- f% y# S8 B2 zode by using3 z, P% |" r h* {; u2 `9 j: ^
vectorizing algorithms that take advantage of this design. Vectorizati
' a" I( r$ F" p' d, z1 ~# Oon means converting* \# n* p2 C5 n X# H
for and while loops to equivalent vector or matrix operations.”。改进
5 R7 y* m$ q$ U" O# D+ J9 V5 l+ d这样的状况有两种方法:
) v4 e% ]1 f: Z# Ha、尽量用向量化的运算来代替循环操作。如将下面的程序:
6 o$ u4 T9 E0 D' d% P; V" ^6 Hi=0;
/ p! i$ E4 F: l- [6 K8 q6 Q9 Tfor t = 0:.01:10( q1 f0 S9 b ^/ o' l1 e: u$ U/ n
i = i+1;
' M( g% D+ _( E( H* [y(i) = sin(t);
" V) D7 ]( |; C* d8 H+ I- lend" J5 b3 ]' v+ g3 Q! O! r
替换为:! p. V* L0 d1 c
t = 0:.01:10;
0 y. j# A; t1 j& Y$ ]y = sin(t);( h* M. R& \+ g8 D
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
9 w" c" b. R* M; P; Npermute、permute、
7 ^1 h2 E5 W i3 H; a' |7 preshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums5 D. j. F: {* _" U: Y2 a4 I
um、ind2sub、
! p% }- o R! hndgrid、repmat、sort、sum 等。; T' L2 d' Z" g/ `2 P1 z
请注意matlan文档中还有这样一句补充:“Before taking the time to
7 ?/ A: G2 s0 m( f0 M& vvectorize your code, read the section on Performance Acceleration.4 U* Q! F( r1 k. @8 a. z A: B, O' I3 {
You may be able to
7 s' a: r/ i5 H" Y ~speed up your program by just as much using the MATLAB JIT Accelera' \1 q [" z9 d; v+ e
tor instead of( K& o: ^3 ^- \& E! K
vectorizing.”。何去何从,自己把握。
0 w+ @3 v; R! r# cb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
$ ]1 Y) W+ R+ V# ?5 T$ K3 w行循环次数少的,
+ z4 ?7 C8 j1 R; t! v+ I- r1 c( V内环执行循环次数多的。这样可以显著提高速度。4 z0 ?( y0 c# J/ q
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on: G7 a4 h! l& h l" H, G( c- p5 t0 w
es、cell、struct、3 x" a e1 L9 ^
repmat等。
; M) L" o- o1 H8 `; Ob、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:! f2 C9 s" T* A, A! k9 y* `9 o3 _
A = int8(zeros(100));
4 b' D. ~! y: w9 x& |换成:* F, Y$ d& } w: z$ ~
A = repmat(int8(0), 100, 100);
7 F4 r: N; P& h4 I* fc、当需要扩充一个变量的大小、维数时使用repmat函数。0 C# p$ E' W9 n! J' r
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。, a8 m; ~2 h& D2 W1 c- i
b、使用Functions而不是Scripts 。& l5 ]% x6 F2 p3 V1 m0 x2 {
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t& [7 G$ c+ @%%%%%%%%%%%%%%%%%%%%%%%
! l7 {( [7 V* Q. P8 p4 H+ q) J1 W三、 绝招6 L$ R7 l! [/ F- v( A+ d( X. b
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
1 {% _, ?. ~# Q1、改用更有效的算法
0 e: y3 A0 \! K* f# @2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 6 I3 B' [. \. B% k3 J ?
4 `( v) W/ d8 m$ a( H, B3 V, s, G 来源:iLoveMatlab
, c3 D2 W/ |& N- a' `4 J6 j
4 B8 G5 e* s! l
" J1 Y! j1 E+ ]+ M, M) m9 g在这里本人推荐使用‘绝招’。 |