|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab, |7 i3 Z) }$ d* ~* W: f5 o
标 题: 加速matlab运行的三重境界
6 O2 W6 F1 A8 E# q- G- d, T发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
8 p# g- P. q$ j' D. a4 I& \) A* T; Z; N ?2 Y
加速matlab运行的三重境界 . {4 G3 K2 x) ^6 @% y3 ?
) T* x5 l6 T. I一、 遵守Performance Acceleration的规则
" T, |" N% J, m* p" d# T8 X' @7 Q' Z% B& T
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
6 }% a' K. |& I) r! \5 [! }7 P其规则总结如下7条:
3 Z3 W, Y* ~) r( [1 }1、只有使用以下数据类型,matlab才会对其加速:
* ` J- C# Q# O8 J# q9 Tlogical,char,int8,uint8,int16,uint16,int32,uint32,double/ c2 L7 K' }5 ^0 ^
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu2 b, t6 R/ w( i: R( z) X
re,single,+ H F7 y1 }9 y/ t1 X& L4 g
% x8 B! n# S* E! e5 a
function handle,java classes,user classes,int64,uint641 D0 G7 t. R6 T, g& s
2、matlab不会对超过三维的数组进行加速。1 P8 {" ]: B6 r- k$ k
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
& C* {8 ^6 ` s, M; Z- M# A/ \7 v& A来表示;
- S. L3 k- i: w9 ?, gb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数; D6 g$ c, \7 n: k. k
据类型,只使用
- z& g% h2 [# Y5 f0 z三维以下的数组;c、循环内只调用了内建函数(build-in function)。
! M$ @( Q4 V' G$ P+ R$ W3 R& e/ a0 [4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
; X9 a* b( \ c6 W8 ~加速运行。( S+ b/ u( F" y" T% d) }* w4 X$ G
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
( }) S; M2 Q8 s' L9 ], zx = a.name; for k=1:10000, sin(A(k)), end;* @. a! J9 v7 U
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速2 S0 V _% A+ a
度。
8 ?2 e ?. ^' V$ C- s; N7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低, \0 C: L- s2 c/ w1 P
运行速度。/ n6 w- l( `: ?; z: L8 o; a+ v
# w2 }4 T: B: \( {二、 遵守三条规则: ^& t3 k: N; V: ^% e
# ?, h1 W! c4 R" X: Q N1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
4 P. h* D3 R) z4 N, Ch means it is designed: C6 o; P0 J6 C: `2 p* C: f
2 f$ e! v8 e2 y4 g% e
for vector and matrix operations. You can often speed up your M-file c, N# k/ S6 y8 s2 @; z2 z
ode by using+ ]( A# C' O- s1 U7 q
vectorizing algorithms that take advantage of this design. Vectorizati
+ W- H. M, l" |; X$ s1 j7 n8 z" [on means converting; g" D. X- M, C% s' l0 D
for and while loops to equivalent vector or matrix operations.”。改进9 _" h: e6 W `5 f! Y s
这样的状况有两种方法:
3 F% Z# m& x( E$ N6 d% m6 r) p
5 j1 k( f! a8 c' Ua、尽量用向量化的运算来代替循环操作。如将下面的程序:$ K: o( J9 l1 y3 F$ |7 J
. h; j, y9 _4 O) m% f: Ji=0;- F( M: @& t1 l, M
for t = 0:.01:10
W! Z9 Z# L1 M1 Fi = i+1;) X2 L$ k; [9 O; T) P
y(i) = sin(t);1 x. { u+ w+ }* `, _
end
6 }. P" E0 X. C0 F替换为:
$ l1 f. Q- Y" z9 H7 y5 H- Xt = 0:.01:10;
; }3 R, l/ n: Y6 jy = sin(t);; o4 [! l# X p9 `5 R
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i2 ?1 t8 |* N3 H# E" L4 n0 B
permute、permute、
r& b3 h8 {" A3 x- B$ v7 Ureshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums8 v- w$ T" a" V# {/ X
um、ind2sub、
; A" U* {- A- andgrid、repmat、sort、sum 等。
8 g" A" r5 E7 R8 ^. a8 _) T9 D* g/ G$ h8 A
请注意matlan文档中还有这样一句补充:“Before taking the time to
+ ]8 i3 ^9 M$ V+ ~9 z+ k
7 P6 s6 j$ v8 x# _2 {, tvectorize your code, read the section on Performance Acceleration., g; d* a- O5 b% V+ N
You may be able to
& }+ W& N! G2 D( hspeed up your program by just as much using the MATLAB JIT Accelera" o) W- C+ K9 z* o9 a2 D' t" a5 y' V
tor instead of
7 q' g1 J! j( U6 e L7 I# F' Tvectorizing.”。何去何从,自己把握。
. Z0 O9 a- }- v/ o2 X) t
2 x6 W, p) t& K; tb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执6 A3 B) c0 ]. h6 X0 P' f
行循环次数少的,) Z U2 @5 _. `, m/ [
内环执行循环次数多的。这样可以显著提高速度。- S- o8 p2 y+ y, V
( d; B Q' R/ X! W* g2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on6 c% @7 X" E% d1 X% a V; g* r8 t6 L' l
es、cell、struct、
7 ]/ y9 V1 m2 H7 D, l ^repmat等。5 q. c8 o$ v) M+ i, W8 D, Q$ d
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:$ C5 a# |8 r" {% _4 l l
( E9 e0 r) j. tA = int8(zeros(100));7 @$ D& K1 x7 s, r6 E) w: J
换成:5 d7 @0 V/ u* T6 O( H! ~" ^
A = repmat(int8(0), 100, 100); u& m% c, W2 i/ e( I0 v" v: b, v
c、当需要扩充一个变量的大小、维数时使用repmat函数。1 `- R0 l; g- _( L
/ _& m2 P* a8 x; R
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
$ G+ h9 K' D* s( v J" mb、使用Functions而不是Scripts 。
( z" D: v4 H1 V7 u+ g8 i + o& b3 ]9 @; h" W1 ?! |
三、 绝招8 b1 f7 c4 e6 v& ~9 y/ k" x# n
3 U: Y: ~! V$ j/ y2 q
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
. [3 ?' L5 G) T8 {. |& _# I% |; {: d1、改用更有效的算法
- o5 x" n6 U* G2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
' W( [* j9 J: f1 e& W) r8 F* X' H2 Y7 v+ D
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
; Z U; M7 s# ]. P' J5 _语言文件,VC编译”。 |