|
非常实用的Matlab编程技巧。可以试一试。
' T! M- I, Y% c6 s3 W" @CTerm下载文章: 紫丁香★. c5 N1 `& U& W8 r+ n9 H2 G
4 k$ T1 s, t6 G) |! E
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
3 P$ e& M- r9 r( \/ E3 o; Q1 L! W4 P7 G标 题: 加速matlab运行的三重境界
8 |! \# c6 d( l& X2 p, Q4 Q$ P( v% ]发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)+ \5 }" }& E3 i3 o9 I
$ i2 H7 Q. X% T( R* s" O" i0 i加速matlab运行的三重境界
- J" `% h; Z# k8 _: [% K' u一、 遵守Performance Acceleration的规则
- P3 X6 @/ [0 A `二、 遵守三条规则
% E" L* [! h+ k' ^7 @" ?) z6 ?三、 绝招
2 g) \- j( o) Y X. b# d一、 遵守Performance Acceleration的规则- ^1 b$ u5 ?+ ?( ^- A
6 S" j, @3 f \8 e h0 h关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 y& v- [8 B# a4 N m7 c# `5 V
其规则总结如下7条:5 L, l4 F4 a" Z7 f6 }
1、只有使用以下数据类型,matlab才会对其加速:3 S$ l6 [" p/ o
logical,char,int8,uint8,int16,uint16,int32,uint32,double
9 a* G5 G+ v$ ?- r# r8 w而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
1 t0 W! A# J4 R d. Gre,single,
! T$ e, P6 y% b' j, `" }9 k* A$ Z
function handle,java classes,user classes,int64,uint64
0 t/ ~* N2 _/ ^# H2、matlab不会对超过三维的数组进行加速。
; ~) i( q2 a t) |$ N' B3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值8 M, N0 o* g* a" i3 V
来表示;
8 M9 E' r6 y7 A" e/ }/ Hb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数: t1 A# f# f# O4 I8 |3 J3 x' G) n
据类型,只使用. A- f: x& a0 E0 Y6 V5 i* E0 }
三维以下的数组;c、循环内只调用了内建函数(build-in function)。. p w! t. x( K& f" B% q2 W
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将# Z ?$ I$ ~. ?0 r4 B0 H
加速运行。
& v% ]* U' A7 [1 m5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
- Z6 i% b1 c$ |' |x = a.name; for k=1:10000, sin(A(k)), end;" t3 n0 i4 D, |
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
) b6 S9 x f7 r3 ?6 L度。
$ L: U* |( Z! D7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低% |3 `7 }: A& Y& K% Y5 [# y& S" f1 ~
运行速度。, x! j6 F5 z) J
) r3 {9 Y7 x- h0 A( W
5 t. y6 E R, E, [2 F: |二、 遵守三条规则9 D7 O7 B4 e4 x1 G: _1 u" a! q$ g
' j$ s+ M: E5 _% W+ G
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
" }4 I+ V8 T& yh means it is designed F# I5 S, c- I: h
% s! k5 y% B& ^for vector and matrix operations. You can often speed up your M-file c2 e4 ]( h7 U# R7 [6 `3 i3 F9 k' {
ode by using
, {8 k" h, b* l# Svectorizing algorithms that take advantage of this design. Vectorizati
; ^, d( ?% s& L+ bon means converting
9 J" U( y& p# C9 g+ r9 }for and while loops to equivalent vector or matrix operations.”。改进! `' i J, E/ t. D" _. r' {
这样的状况有两种方法:. G3 \1 O; Z( [) u$ r0 p% K" B
|/ j* g0 Q+ h8 \a、尽量用向量化的运算来代替循环操作。如将下面的程序:/ S1 p. x" i3 E2 f
/ ]9 I3 y6 X" r& e3 X1 [1 d$ @i=0;
4 m2 f) y; |& R8 w6 |for t = 0:.01:10" M8 T4 Y: `2 i5 j3 T
i = i+1;
- \8 Q' k! U8 A: _- a1 g6 wy(i) = sin(t);) Q2 J' M( T3 b( H/ p
end
, ^4 J, L8 c* v! l( R8 W替换为:
5 m& E& N2 _3 ?; ]+ H& u- jt = 0:.01:10;$ ^& {% e( ^) P# ]+ z2 X6 m) N4 r
y = sin(t);5 [; ~+ {0 _0 Y5 ]! c. `
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i( _, ]; Y; ?& \# B& F
permute、permute、
/ P0 k0 g, D Q. P* N+ z3 mreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
" @# J* l: X1 f: gum、ind2sub、
. F8 a1 Q- r$ f% G- G4 Tndgrid、repmat、sort、sum 等。
' f n8 X* A3 G
- W6 f2 j1 ?; h, P4 q2 V0 F$ R8 v请注意matlan文档中还有这样一句补充:“Before taking the time to
5 z% y) Y; h: l! F- _% ^% q" Y7 }, @- t# j. c5 V0 \' c2 R
vectorize your code, read the section on Performance Acceleration.
6 R9 ~( m4 X1 `4 Q/ xYou may be able to
- Q [- Y! H& H' A" zspeed up your program by just as much using the MATLAB JIT Accelera' u, p/ t R' ]9 N2 n8 A
tor instead of
; _, d& J$ r1 ]6 x2 ovectorizing.”。何去何从,自己把握。
3 p! G y" c- `. b& {; b5 o2 K& m S; P, f! V2 I
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执" Q7 Y r5 Y* R
行循环次数少的,
8 Q' D' a5 I- \内环执行循环次数多的。这样可以显著提高速度。$ Z; L3 N: H4 w& p
$ b4 K+ {* p( F) W% n0 V
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on3 d5 e0 e% l0 a p4 K: g( E
es、cell、struct、
# E7 g$ ^: d) T$ A- W* N0 u; Wrepmat等。& ]1 y: q9 i' K2 a* i
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:1 ~/ g. |4 k! \' ^& E( a- s
+ ~) U. O& D; a8 w3 B: ]
A = int8(zeros(100));
+ Z9 u8 N9 T3 f3 w* A+ y换成:$ {. X) [% Z; {- _; ^, I3 \4 X ~
A = repmat(int8(0), 100, 100);; d9 q a) ?4 D& a2 ?" ~
c、当需要扩充一个变量的大小、维数时使用repmat函数。! M, r) j8 o/ s. t, N
% Y9 \- ] A8 M& W4 Y
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。9 v+ V5 _6 E% z) `7 w2 D- n& J* v
b、使用Functions而不是Scripts 。8 P( y$ g* N1 A1 L4 D, c- ]
" W& ^. _, y- s1 r
' N j& w( H; f6 ]2 D. w三、 绝招6 a8 n( k- Y+ N, c
/ }% G! S3 v/ d
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。( T3 I6 j/ }! g# [; j* T% s
1、改用更有效的算法
8 h8 g- @1 m+ H- `2 d/ X2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 |9 |0 D8 U4 m
/ R0 ], p: s9 p
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
" `# R* _5 `$ ^" x语言文件,VC编译”。
* {' M8 X6 A# A4 ~ |