|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
2 f! U7 C1 p% N) _8 v6 W! u标 题: 加速matlab运行的三重境界
5 ?1 o0 ]7 |) y" B发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
5 \: W4 X) |; u9 C" T/ `9 I; S5 i3 ?8 @) l7 }" `) `, ?" m
加速matlab运行的三重境界
1 S7 b$ {" V# x5 l3 R
1 s* R$ X) j% P7 m一、 遵守Performance Acceleration的规则5 Q5 n) D& }( h* }/ m
# d" x( a! f5 z6 ~- v9 s8 Z+ j, ]关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将: _6 ]4 l% \/ V4 _& Q/ `) p2 J
其规则总结如下7条:' N0 g3 w, w! B3 x
1、只有使用以下数据类型,matlab才会对其加速:) U, F* y+ u0 U, E
logical,char,int8,uint8,int16,uint16,int32,uint32,double
# B9 z2 k* a# e1 i% f5 b而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu. I1 U: d5 M6 ]4 T% D9 K8 l( ^/ Z
re,single,5 H: H( G: l# P* R! S! C
1 r5 V* a1 o9 q% q: W
function handle,java classes,user classes,int64,uint64
7 M8 Z+ e8 p( m2 w2、matlab不会对超过三维的数组进行加速。; q" o3 N& V4 w9 T [; n2 l; z+ H6 |
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值8 `/ [, R: w( a( u
来表示;+ w* D" \* h0 b7 y1 D
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数0 R# d8 k& H8 j' p, i5 y0 u8 B
据类型,只使用; J9 c" [ [ E2 [, x# X# i% {0 ^
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
5 i: o# b5 ?1 q" h% x* c9 u: F4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
/ F% n0 u# i) b$ [- Q( W5 N% v C加速运行。
5 S$ s# O4 c9 a( I5 F5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:% z) X/ `4 N+ K) q6 I. H; q7 b
x = a.name; for k=1:10000, sin(A(k)), end;
* b3 Q9 `6 g" P2 D. ~& B6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速4 O4 Z0 n m* Q0 S: c. w! r- r
度。2 W( x. B6 X: M9 i3 W& ]4 s1 p1 q
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
2 f# }& m; w; N运行速度。
_3 u8 A( j5 q) P G& s" H3 e- i! F
二、 遵守三条规则
/ k T2 \( A: N0 n' C0 f/ P+ e% u
* A; r/ u% d7 [; \1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
$ {) r. _7 P9 T+ v' [/ C) Kh means it is designed# K: n- j" J d; _' s: O& {5 s
4 e( n* `/ h4 ^0 L
for vector and matrix operations. You can often speed up your M-file c+ ~( N4 L/ y. P3 p4 h& e$ ~
ode by using
6 Z9 E& G. p0 z! O+ M( Uvectorizing algorithms that take advantage of this design. Vectorizati
* C; e% o1 O; q! F/ i8 Y+ Con means converting' U8 [5 h9 r X. T' N
for and while loops to equivalent vector or matrix operations.”。改进8 _0 j9 Q3 i/ O0 c& ~: e
这样的状况有两种方法:
3 Q! n1 n+ X& ]0 r+ b" h- M+ B5 F8 N3 m
a、尽量用向量化的运算来代替循环操作。如将下面的程序:. H9 ]6 j/ R5 R. x5 ?5 G* A! q4 @- C
* ~; G8 ~6 U j: W5 C; p
i=0;
. L6 V( [1 D, ^/ b8 ufor t = 0:.01:10, h( x+ G4 {/ g: J
i = i+1;
: k7 b4 q) Q( D: b s. S by(i) = sin(t);, k* i# f8 W5 y: a5 P
end
/ a; T0 `% v, K8 u替换为:+ f! J7 m" B7 @, k
t = 0:.01:10;
+ Y* `& A# K; k4 n F) k& W% oy = sin(t);
* w- o% ^, S( S- T; U6 o7 j速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
+ f' ^7 T5 v9 `, L+ epermute、permute、
# w2 i P0 R. m' C, a9 _, jreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
- Q. C% N7 h9 U: ]" U/ [) c& Uum、ind2sub、3 d; T2 X/ M& X. A7 B
ndgrid、repmat、sort、sum 等。: G4 a5 Q7 Y' _9 G
" z% h; X" f/ S7 V请注意matlan文档中还有这样一句补充:“Before taking the time to& e; E$ [" \+ E
A, A+ _6 n* m3 x" N' O
vectorize your code, read the section on Performance Acceleration.4 Y8 M- Q" v2 N0 f6 G I4 z3 h8 e, p
You may be able to9 G. Z* d# f1 j. t, I5 ~. u6 m
speed up your program by just as much using the MATLAB JIT Accelera
1 |- l# Y9 F. d0 b qtor instead of1 w, n" y1 {6 W' U+ ~; c
vectorizing.”。何去何从,自己把握。
\" G- x& g/ p% I" }1 |. S4 j2 `
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执5 ?6 I/ i+ e1 e( K2 r& V
行循环次数少的,
3 ?6 Y; O& J6 d7 }: h5 K; U% ~4 y$ U内环执行循环次数多的。这样可以显著提高速度。$ _0 W/ Z" m$ k# o4 ~; |
! j8 l7 N) n- n3 M) \3 S
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on! B4 g+ ^* {" e2 F" Y
es、cell、struct、
: X) M, t$ h8 [4 D: \2 I& E5 I, n2 arepmat等。- P7 L6 h9 U$ n) w6 Z! D
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
' S- R9 `; E7 _; n+ ~. C
9 h1 q, Q& j- [: ]7 lA = int8(zeros(100));! y5 R2 ^) b& r- E6 s6 B
换成:4 {" _9 K8 d- b! w
A = repmat(int8(0), 100, 100);3 D! \& c' ?% ~* E3 y# U( m, R& S
c、当需要扩充一个变量的大小、维数时使用repmat函数。$ J' o5 D! ?" {2 \
* X& F& Z$ y1 ?/ y5 Y& C8 |8 t
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。- H2 [2 W1 Y$ T8 t) b9 @: l+ C' K& R
b、使用Functions而不是Scripts 。
, {% `" a, F$ d% f6 ` % `5 S; k7 W/ T+ [ L4 V" N% G( I3 M
三、 绝招8 M, b; m) {! x% e7 {
- s: A& w4 ~( Q& u2 l" A你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。) P/ L: i4 N( R- o
1、改用更有效的算法( w6 p/ P) z7 ^ w( U
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
" s% m P, ^+ L: m! _7 w: N) {; C/ B+ r
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
# O* T5 I+ X! b- d语言文件,VC编译”。 |