|
非常实用的Matlab编程技巧。可以试一试。
, @8 G, c5 z2 H4 B6 b0 DCTerm下载文章: 紫丁香★3 T8 R5 ?+ l. q/ ^
6 t2 R/ R; Z/ U9 `
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab" z$ y! A( e0 [
标 题: 加速matlab运行的三重境界$ p: m* e+ [' l$ y( r! w \
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)$ M6 [2 c3 Y/ p7 Q, ^, e7 T
( F z0 \6 J: ]" w0 ]' ~/ N
加速matlab运行的三重境界: U+ `) x' T) _! t6 M& Y2 R1 h
一、 遵守Performance Acceleration的规则
6 p9 n& p2 \5 R8 {$ u) U4 ?. d" N# A二、 遵守三条规则
: W& y7 D( S" w9 E& u7 O. a三、 绝招
: H& u( W) m9 N# [! ~9 m$ c6 x
一、 遵守Performance Acceleration的规则
: r' M- O! @, U7 I
6 z! t1 G% i. ?" {3 \关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
5 N7 q' l" B5 M7 W5 m其规则总结如下7条:
1 i! d' f& l5 T0 N8 F0 j1、只有使用以下数据类型,matlab才会对其加速:
* W1 Y Z2 Y' {! T1 Y2 p5 Ilogical,char,int8,uint8,int16,uint16,int32,uint32,double' [: {$ @& Z$ o( L; u; o
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu' h( A7 h. ?* b8 o! ]8 n% x
re,single,
& a4 {( P& a; B& E6 b* z! {( j+ d3 R! k( l! o8 a
function handle,java classes,user classes,int64,uint64
* U2 {- e2 g5 d6 x$ V' T2、matlab不会对超过三维的数组进行加速。
L6 }$ ^- D0 E3 |$ l* J3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值: G6 K; o! e! g2 j( ^, T+ t
来表示;
, ^% ~% M; m: C9 Zb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数( m3 O6 X' H7 N& [, K& K
据类型,只使用" q/ @% b4 J- h' t7 ^
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
( ]% x7 D9 a! n# P4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
! m" N; E9 n( ~9 o$ h( F3 m. }加速运行。/ R! _+ ]8 Z$ T1 s( T$ l1 G, G
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:8 E5 X8 b4 A( I0 G
x = a.name; for k=1:10000, sin(A(k)), end;
9 D7 A* a G- i+ s8 A' {6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速" E2 v& `7 F" r
度。6 j# ]0 M3 q, D3 N2 Y: f# a9 u
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
: s: \ X, T' t% O4 t0 [+ T- B运行速度。, H, h* O- E3 s# w _
" t9 n" K, {9 V( E% z! M
* W/ ~! P! k- T& Y- h
二、 遵守三条规则
# G* _3 v1 Q( R+ m' r* N
) B V* D! j1 C$ G2 y2 F1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic6 z; l) y( m( t( w* u; M9 t9 A
h means it is designed, S/ w- h7 \' Q' M4 F; C
: p: }* k- e8 N& W
for vector and matrix operations. You can often speed up your M-file c: }' [1 I2 Q* E& m
ode by using% X- X0 y( F9 D9 I) s* E9 r1 d
vectorizing algorithms that take advantage of this design. Vectorizati4 o" j; a( X. x, u
on means converting
' X: g1 }0 }# Hfor and while loops to equivalent vector or matrix operations.”。改进* s) I \% L6 Y2 a2 g
这样的状况有两种方法:+ O% I! U1 W* l! ^0 u h
$ ^. O* ^) P1 c P& w+ ~9 ~, Q
a、尽量用向量化的运算来代替循环操作。如将下面的程序:3 r* O5 |; B$ |2 p- Q
* s3 m+ d e. G& [( a3 E* g1 e
i=0;# W: G0 X% X5 M+ [, C4 M
for t = 0:.01:10. `: G9 Y( t( c3 u
i = i+1;' q$ _9 a* \9 t3 _5 o/ w/ C
y(i) = sin(t); ?! W/ |& F. C" T. o
end/ H- d1 F0 D' G/ O: G+ J, `8 c" Z7 t
替换为:
, a& d) |! h8 n& gt = 0:.01:10;% Y! y+ T3 L2 E. A
y = sin(t);0 H8 H O% h- \' }& J
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
# N4 U/ [: j1 t6 g( Hpermute、permute、
: E$ u& P2 K: x. ^0 M9 z q. h* O7 Rreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
% m4 P4 z) d' v5 y, n7 wum、ind2sub、
* c% I$ I/ G3 Indgrid、repmat、sort、sum 等。
4 _( C5 T K/ _
0 Z, y' {1 K5 |" h6 I# B请注意matlan文档中还有这样一句补充:“Before taking the time to
0 c f9 g, q+ C1 S* A0 Q1 h( H9 J
* w; o" X- a& A5 f+ I" V1 \+ kvectorize your code, read the section on Performance Acceleration.7 _; Q! R: j6 T" B
You may be able to
# I8 o2 `6 r% r! @/ Jspeed up your program by just as much using the MATLAB JIT Accelera
# u7 a! f' O S% ]: b9 u; gtor instead of3 q+ M. V; t: y, z! G1 ~4 c8 Y
vectorizing.”。何去何从,自己把握。
5 T( _5 v$ m- f2 h' M- E1 i( A, J9 p, i- t" Z
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执/ ?! g3 X+ _" l7 }: S7 E" j
行循环次数少的,8 }. \6 }7 K' j- \) |
内环执行循环次数多的。这样可以显著提高速度。% {" o+ x3 x( ], x @
1 |2 L8 W7 y1 h; J1 q
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
! Y a6 K, P t( O3 H7 } Jes、cell、struct、
j1 [5 R9 e2 d Brepmat等。
7 y A" s1 E7 j. Xb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 ~' `: M6 w" B
5 h! |/ Y. \) V
A = int8(zeros(100));
; l* D9 b7 O6 l6 v换成:# [: W# l7 Q/ g
A = repmat(int8(0), 100, 100);
% E K- j6 c# d3 Kc、当需要扩充一个变量的大小、维数时使用repmat函数。3 i+ \2 o; H! p3 r2 a5 ^6 t1 A! h7 i
& y' k1 {0 z, t# K2 Z
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。: l* @5 F( I' ]+ m
b、使用Functions而不是Scripts 。2 ]! `! S3 x4 @! `. K+ ]! p
3 F/ z" r3 R. U" |6 L8 u
: C& g* r/ m9 [/ }% [- w. E* w三、 绝招) I* g* Y. g4 ^) b1 z
% d4 r# o+ F, ]9 S你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
Q; j6 S. @' C1、改用更有效的算法% q2 P& H0 p/ i+ z( T8 Y
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
P1 B0 p8 S9 H: K: q
5 S {, \5 y1 W1 a关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
' Q ?% h2 H L; J B4 x& d- K语言文件,VC编译”。
1 J5 u0 v. ~/ t$ a8 g |