|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
+ ~) L0 d f+ w1 ]# n2 [' N( {- P标 题: 加速matlab运行的三重境界
1 V$ v0 c. _5 i4 F: b发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)9 E9 e4 D N- B4 m5 E! r
- n7 |, y9 c% D& ]- B, ]加速matlab运行的三重境界
) b# g; R8 N6 r" W+ y+ s
0 |5 ]" t1 q/ w& k3 g一、 遵守Performance Acceleration的规则9 u( L! J, Q, B; F# R& Q1 t
& _& s$ r- S c4 J关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
w% {+ H, [9 d其规则总结如下7条:
6 v4 r* i4 E! n5 ], F1、只有使用以下数据类型,matlab才会对其加速:( B# v% i: b+ i, ]- h+ g8 Q1 | z0 L
logical,char,int8,uint8,int16,uint16,int32,uint32,double
+ F) k! @. \2 V B: N+ V! s! J而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu; H i! t$ q U' g* E8 j" I
re,single,$ T% S- L# s6 M6 W& r+ o
' \4 l( M: y: Y' }! X( ifunction handle,java classes,user classes,int64,uint64, R8 u1 k- a9 t' V4 g+ J
2、matlab不会对超过三维的数组进行加速。
/ G3 E! V+ e6 z7 W6 F& Y4 ?3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值! k) o \+ B/ K7 z) e
来表示;' j3 |+ A5 j6 M. L& N
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数& b$ K R& ~# t- A' w: O, o* }
据类型,只使用
; n& {3 j5 `: y1 G3 v; O三维以下的数组;c、循环内只调用了内建函数(build-in function)。% \5 \- E+ p4 u0 G ?' g0 T/ O
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将& l- k7 U1 S% `) d }
加速运行。% _8 E, z1 z Z/ e
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
+ y" h1 a6 p) h# J& Zx = a.name; for k=1:10000, sin(A(k)), end;" L0 \4 w' ?( i# k7 b4 W K1 P& t
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
8 U& R3 q8 U9 W! f0 r度。6 ^+ a* a G+ ~0 G2 _
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低0 G8 Z, m6 y7 W# z% L
运行速度。! x4 `9 s2 j+ {" A1 `& _) p6 S
+ f$ Z+ v; ^: P5 h二、 遵守三条规则& Y! M! s- R+ p4 u7 G, L, d
# X" K" G; I' T+ P6 L: J1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic I* `9 p& o& Q, A) `# D
h means it is designed3 K5 V. E1 c) }$ L; K) z, v' ]
& R( ?# g* j+ X3 u& u: k" zfor vector and matrix operations. You can often speed up your M-file c0 [5 [) U, y0 J0 [, O
ode by using
. s8 n# l- D$ V6 P8 evectorizing algorithms that take advantage of this design. Vectorizati
) L# l1 C3 j1 l4 H. u# L( {on means converting
8 ?# k7 ]/ A' c Q0 V% k# e5 _for and while loops to equivalent vector or matrix operations.”。改进3 r2 \7 |+ Y$ w j
这样的状况有两种方法:
0 y% l0 e; _' ^
* @2 u! s% E- @; sa、尽量用向量化的运算来代替循环操作。如将下面的程序:
! n( x# E% R( O9 Z% f {9 N4 L
$ u, I t- F) o+ Pi=0;
9 f& _5 @* o e% @/ ? Cfor t = 0:.01:10" X8 [- w1 {. `# q% R9 n
i = i+1;
/ t, a, J; S8 h& [9 N5 X& Zy(i) = sin(t);. Q# k. S* {( J! H6 r
end
* i4 l' n3 A0 I; s替换为:2 e S5 c4 o0 O6 N, r* ~( |# B
t = 0:.01:10;
) A* m! n- G u2 b, t }* x1 Ty = sin(t);
1 Z3 @0 e6 }0 i速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
1 \- a+ f5 x! x$ e* Wpermute、permute、
0 }# R0 t+ P: t9 R4 D& q" Creshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums: D/ y! I$ J8 m8 K& o- k8 F
um、ind2sub、6 L3 u3 G$ T/ ?, i# S1 r
ndgrid、repmat、sort、sum 等。- W- [1 S# y9 L& s% }/ P7 N
# l- a2 P F4 f3 F- S
请注意matlan文档中还有这样一句补充:“Before taking the time to T2 X5 ~2 A8 U, T
. o( q8 L2 T# h5 I7 ]* @vectorize your code, read the section on Performance Acceleration.- F9 A8 [( r$ e9 `
You may be able to
- v. H7 a: G6 J8 o% ?! uspeed up your program by just as much using the MATLAB JIT Accelera" ?/ T. q! r9 x- c$ h- R7 D
tor instead of
* b/ `+ n$ o& _9 J2 g6 E+ ~vectorizing.”。何去何从,自己把握。
, u' _3 P* @& d6 {& x$ a8 R; Y5 _# r7 |* S' ?; g
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执+ W$ f4 {1 k1 _6 }: ^$ R7 Z D
行循环次数少的,
# Q1 w- ]4 p1 R/ E" Y7 u5 `+ b5 U内环执行循环次数多的。这样可以显著提高速度。
- d8 M7 U# [8 ^4 M
+ o8 |! ]& f& h6 m* g Y2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
: R; x! H9 ^$ T: f* ~es、cell、struct、 R3 T5 B' J3 m) M$ b# |4 A
repmat等。
/ |; N) i- `7 {6 S( _+ ub、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
& Y. R: r5 I. ~( v2 z# T! V4 E% N4 w6 ~& @8 x
A = int8(zeros(100));. V8 p% Q* X, a3 g
换成:% F7 E# ]7 P0 k- N+ q
A = repmat(int8(0), 100, 100);
5 K& `) y/ e y* G$ ~3 hc、当需要扩充一个变量的大小、维数时使用repmat函数。# A6 p! C4 a$ f/ {+ f/ i9 ~9 O/ e
8 f: |2 Y+ [9 c2 I4 b# T3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
8 w; g- U& Q2 Jb、使用Functions而不是Scripts 。
+ ?* x" y! q' {4 }( }7 p- f# Z' B ( L# f8 r8 d- H5 o0 {
三、 绝招) S4 ~9 _2 d% \# `4 J* k
4 `# K" C+ S( C3 R" a你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
' E+ Z4 q, r; g0 s8 p2 E1、改用更有效的算法
) i# H. ~3 R# B/ `2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。* t/ p% K+ Z) @# f
3 T4 H3 B6 ^) x. F" u7 X5 L w% m
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++( K7 Z( y4 u4 v$ U; C% s u
语言文件,VC编译”。 |