|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab0 T* L+ i5 m2 j8 j, t
标 题: 加速matlab运行的三重境界
9 T. V: D0 B( u/ {/ E5 g3 g发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
+ F l* q+ d! D ?7 n' z! {, y! Y( w, l* Z. t5 y& i6 \
加速matlab运行的三重境界
7 c) v) c8 u( P! q
: Y" J1 v) o+ l! O' _一、 遵守Performance Acceleration的规则; I1 |3 u; s4 t) O9 M* m$ D
# N1 a- R2 {0 J- l. y# K* n+ V关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将, B" i* T4 F1 g6 J! Q/ W
其规则总结如下7条:9 u+ l3 Y* B6 N3 C
1、只有使用以下数据类型,matlab才会对其加速:
4 P$ c2 v6 B7 A: w3 [logical,char,int8,uint8,int16,uint16,int32,uint32,double7 w# ]: V: x3 H8 }7 d. C
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
8 y) W5 u) [& z- X, R; @- P( J: M' ore,single,
. C: P( W6 i6 d& V( K$ d- m3 {, V# k% ]- x
function handle,java classes,user classes,int64,uint645 O: L& g( l- C
2、matlab不会对超过三维的数组进行加速。: d# _+ l0 G* @& S$ u! r2 z+ Z
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
, i1 t3 Q' p j. T4 ]1 p来表示;, M. e( ^0 e6 Y
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数4 _( v- a) I# }" b( {8 o
据类型,只使用" k7 m* F' Y7 a" j; K
三维以下的数组;c、循环内只调用了内建函数(build-in function)。7 i8 F2 C: j3 C9 q0 E% f" Y
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将1 ]7 K5 I9 |/ S! `
加速运行。' C$ m6 d5 w+ _! l5 W
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
! m2 I0 I1 }! H0 }3 A! Hx = a.name; for k=1:10000, sin(A(k)), end;
6 a' n0 e$ U% q% V' {9 N c. [7 d* u6 K6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速' E: H3 b- K' S( x2 y
度。
( x# D( t+ L6 [3 x$ L0 ^7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
1 c/ p4 O. {+ {6 W% j运行速度。
. F) E/ V5 |3 I3 u, T8 B 7 t( \7 [$ \1 F6 M
二、 遵守三条规则
. i0 n' X7 n# b5 I0 P8 R
( @) w, m3 e- y- t& ^* j+ e1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
& f8 j& r% K: I# g" t2 ]h means it is designed
2 a9 `. @) q0 w' d/ w) g0 ?2 m, H# w u% F+ b# k
for vector and matrix operations. You can often speed up your M-file c x8 B* X+ i/ h) w/ j; N9 P7 y
ode by using, j, ?" P$ h4 V/ f$ v
vectorizing algorithms that take advantage of this design. Vectorizati
3 p- M {) B7 u6 C9 |on means converting7 ?% g' a. l; D0 ]- t
for and while loops to equivalent vector or matrix operations.”。改进
+ u8 C9 ?6 e3 u4 [" @- b6 i1 \. C P这样的状况有两种方法:
& r6 Z, ?/ A" ^! P( @$ t, P' D
8 P- a' C$ t3 e7 sa、尽量用向量化的运算来代替循环操作。如将下面的程序:1 A# N `& \- f u9 ?- S! ~
: C/ e/ s l3 B0 U. n
i=0;
' {4 T5 a* u: Bfor t = 0:.01:106 F$ ]5 }9 C5 G- n2 K M6 X
i = i+1;
9 w# o3 v& N. R- dy(i) = sin(t);
$ L4 D& ?) D( y; C: {end
! I A2 _# T# h2 T0 I替换为:5 u7 Y) r7 K% B( Y6 m. y+ \
t = 0:.01:10;
! c2 w& H$ @' ^' V9 h& H7 Jy = sin(t);# Y% L: f! J8 a, z! t; R0 l
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
, D! Y: {2 K0 S5 P! F# D( P( y- u7 w% `permute、permute、
" d) K( F0 R) Vreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums* |& \. \. E* U; w$ ^
um、ind2sub、
2 K% L% V8 N0 ]: P5 Y& bndgrid、repmat、sort、sum 等。. N7 c( ?$ G0 [" W" c
+ u( |# C9 w* m& F6 ~. p: I
请注意matlan文档中还有这样一句补充:“Before taking the time to
) Z& b0 G* `6 B1 A. \+ x# M4 [, N8 X3 _; h
vectorize your code, read the section on Performance Acceleration.! Z* l4 H$ G7 Y% U2 E1 ^
You may be able to
+ Q2 |. h+ `8 G( K5 p$ G0 Tspeed up your program by just as much using the MATLAB JIT Accelera! S6 p6 i: b4 p
tor instead of: T$ f2 o$ K$ N+ f3 \& U
vectorizing.”。何去何从,自己把握。$ |! {2 I) e t. |3 f! k1 Z& U
7 [ l. q$ ?" i# y7 U- U3 nb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
4 n; R6 L5 J) P% b行循环次数少的,
1 {/ O p9 n8 @0 q5 V内环执行循环次数多的。这样可以显著提高速度。( j, @/ ]4 _, p ^
' p5 Z4 @) K0 v4 U
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on0 W1 [ g$ S3 j
es、cell、struct、
9 u, j9 Q$ |( y+ [+ T# \5 `repmat等。& J9 `0 m+ S& T; J
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
" F& f: Q* ^5 g$ A9 ], A" R
5 S9 @! W. Y& RA = int8(zeros(100));2 m# w. D# @' n) ~; Q4 k3 l
换成: u, [( Q; |, `4 ^+ }) v% A4 o
A = repmat(int8(0), 100, 100);. w0 ?4 ]2 I6 ^) k, z
c、当需要扩充一个变量的大小、维数时使用repmat函数。* X! `, W g$ o0 p6 W# F1 ~! a
/ j+ l8 u H$ u: A2 a2 Y
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。; [& K) s4 w9 q, |
b、使用Functions而不是Scripts 。$ }1 u% [% V- q' B5 a/ A
0 _! T5 j- Y4 `& U, s
三、 绝招
& e! ?2 R% x9 \) q: z9 U. Y: K4 B) A
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。+ V+ A1 r8 v; D+ [
1、改用更有效的算法7 r5 W0 O. ?# x6 i
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
% s C( D: j; R: P9 S& w! ~ L: h! Q% Z" d2 S
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++# G/ R' Z) _7 }3 S) a9 C# `
语言文件,VC编译”。 |