本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑 ) S5 N' H0 k9 w( f( k
" h8 i; v, h8 {3 k加速matlab运行的三重境界 加速matlab运行的三重境界
5 D, c7 M" Q o7 f( z2 M- v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 u' x2 i$ U2 P
%%%%%%%%%%%%%%%%%%%%%%%
% o/ F, d" Y6 Q/ r, e$ u' J# D+ f一、 遵守Performance Acceleration的规则. Z( d3 h9 G% R
二、 遵守三条规则7 F; s( o! L, t. W( ^ D( W& Y( ~
三、 绝招# v& G) c+ p; K' S+ x2 J0 H7 `. o a
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! b. _. k( V" Y( o3 W%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则
3 ]% r6 E0 `9 G" U/ u1 i关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
p( C* j( Y5 P- P. y5 D其规则总结如下7条:
2 {8 W: R3 j: ~; F5 I1、只有使用以下数据类型,matlab才会对其加速:7 ?. i* T% d# {# ^, G7 u4 `
logical,char,int8,uint8,int16,uint16,int32,uint32,double
: c! d) T1 z! \2 A; U, {3 B+ J而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
' Y# @' V. p- b: V8 s6 e" f) ?re,single,2 n/ o6 y" {8 K& f' @
function handle,java classes,user classes,int64,uint64
; l% Q; g. R7 w' n9 B6 D I& V8 k& Z2、matlab不会对超过三维的数组进行加速。
; ?/ X; G: k1 ?+ D1 c) N3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
; E2 `. s0 n0 ?# b! y5 `来表示;6 o) v) H6 u- j9 b9 L* o0 D
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数( r1 F6 O5 v7 L* A
据类型,只使用! N) U- A0 i) D
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
- R7 f3 M& x ~! a+ z" h3 v; m) u4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将- D7 [: H, z9 j S( O2 Q, p: h
加速运行。
6 T. x2 T! z: U$ [' W5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
3 s7 ?# O S, V( x2 I" A, Xx = a.name; for k=1:10000, sin(A(k)), end;+ O; @0 V g- t5 [- M8 m& r
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速/ t) {# p: f( B6 ?9 ]
度。
7 W3 c* y& ~% V1 O D+ [* n" h( i# h7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 [2 p6 i2 _2 f/ Z* v
运行速度。% V) G: I6 o# V4 {: ^( [
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- v1 R, t4 ^! Y2 B0 ?' q' X
%%%%%%%%%%%%%%%%%%%%%%%
& N e+ A' |0 C* N9 G/ f二、 遵守三条规则, |2 d: p* I' G+ O9 l
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
8 d+ U E8 D) hh means it is designed
4 _0 }. u" V4 Y& x# D) u6 b+ j0 afor vector and matrix operations. You can often speed up your M-file c
, [' B6 V( d0 c. C3 Qode by using
: m$ b: d1 ~: Gvectorizing algorithms that take advantage of this design. Vectorizati5 ^3 ?/ A0 Z: y% p
on means converting: o; s; r5 }0 t' I% g* {
for and while loops to equivalent vector or matrix operations.”。改进
! S, g7 P$ ]" l这样的状况有两种方法:
+ K/ a g9 s q5 j$ Ga、尽量用向量化的运算来代替循环操作。如将下面的程序:
9 u V0 b5 f" S& Q2 I3 Ei=0;
% ]+ p& |7 E$ I) I8 k2 `for t = 0:.01:107 H- Z* [ S3 V: b0 h
i = i+1;* X# C, l3 J) N7 L* | e
y(i) = sin(t);
: l2 w( e) r2 J. S$ f( v# \# m& k7 \4 `end9 W& v9 w1 p& `+ ]$ o1 f& h
替换为:% j4 S) ?" [$ s6 n
t = 0:.01:10;! L4 \9 O$ M* \, {1 [
y = sin(t); s* c9 q' r4 b, O
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
+ u# e: v. V( C5 W9 {! u y6 fpermute、permute、
9 l6 H7 i2 O4 Freshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums; f9 b+ h0 h) c# F! a
um、ind2sub、# K& `8 e s. b. E/ _6 ^
ndgrid、repmat、sort、sum 等。
. R$ Q! v3 h% \请注意matlan文档中还有这样一句补充:“Before taking the time to
4 q1 z5 j8 s9 `+ ]3 s9 fvectorize your code, read the section on Performance Acceleration.
8 I2 Z- @" i$ |You may be able to
' q1 }3 Q _; G% c9 p* Q" gspeed up your program by just as much using the MATLAB JIT Accelera
% @2 m$ [# G! q) p7 Vtor instead of e' ~1 M+ @9 a# }: O
vectorizing.”。何去何从,自己把握。3 g3 p( q& A s+ t2 U( [: ~9 s
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
' ]$ e. f/ Z7 \4 }行循环次数少的,( e% @" q( j: u5 S! D
内环执行循环次数多的。这样可以显著提高速度。
; \! Y" g; Q/ `- d2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
; d! G( a3 L- c+ L2 {) N1 pes、cell、struct、
' m' P$ [2 `7 b$ Y) H; \" F% Irepmat等。5 j- p; G" ?* j" p8 x% L; a2 l
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:8 l d# o" Z* U$ K$ O- z3 ^; z
A = int8(zeros(100));& r, P* S4 y9 _( k( O7 r, k3 v
换成:! ~6 f" c, D3 f4 Z
A = repmat(int8(0), 100, 100);% a/ C9 z5 w1 ^% c
c、当需要扩充一个变量的大小、维数时使用repmat函数。
% k+ s. F' K7 X+ k; N: I3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。# C& S+ K& {% Y
b、使用Functions而不是Scripts 。
. j0 w: x: z+ Q ~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 G$ H0 i; g, E( f B
%%%%%%%%%%%%%%%%%%%%%%%5 E2 ?* [# ?& [6 N5 C9 ~# R
三、 绝招 X% b- X3 H! } y9 w6 B
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
4 r$ ^: H6 o& R* `1、改用更有效的算法$ J1 Q# Z }0 v3 _7 U6 V
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
3 `9 b9 Y4 I* T9 K* D. O
* L% Z7 l9 O0 W6 e2 y 来源:iLoveMatlab
7 a+ ~4 Q g! g- J- H' Z, _; }7 h& ~. D8 l' V7 P% {
+ C$ z1 m- d5 b9 U& R
在这里本人推荐使用‘绝招’。 |