|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
1 Z P! v8 c7 B# Y$ c8 J [标 题: 加速matlab运行的三重境界+ C5 v: M0 @6 S1 x0 }3 ]4 j' m
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
6 ]4 c8 m% b3 M1 x
9 P/ U" ^# U* @4 r加速matlab运行的三重境界
" z# ]" B3 J( e0 }
! _; j7 Q& o ?8 Z$ Q l6 H' z一、 遵守Performance Acceleration的规则
$ B: C) J( V( ?
/ V, A7 J7 i3 d关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将4 K$ O+ L- _ X+ D+ y2 o
其规则总结如下7条:
: c) n# N" i2 y% @# J% F' h5 S1、只有使用以下数据类型,matlab才会对其加速:4 |, C2 D2 v, c2 j
logical,char,int8,uint8,int16,uint16,int32,uint32,double
u$ I2 t9 e! Z而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
! [' \; `' c- \/ _re,single,
' _* o( |8 p+ V
$ s1 \3 u' N0 Q- Xfunction handle,java classes,user classes,int64,uint64
. k& |" t# `0 `8 b: b2、matlab不会对超过三维的数组进行加速。
9 s; ?$ D7 J3 A3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值# A+ P3 F5 l; w0 W* n5 G% @3 `
来表示;
Z' B4 C, g3 D& Vb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数* z$ h5 e) v* W
据类型,只使用
- |2 F) Z% T* l7 x! H三维以下的数组;c、循环内只调用了内建函数(build-in function)。
[* a# X1 w# R. T# |4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
. f& @1 Y; H% G5 S, |; E加速运行。$ _) Q3 _* L2 ^; i0 o5 ~/ O
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:% B$ s, j2 t W# C/ m; j# {8 l
x = a.name; for k=1:10000, sin(A(k)), end;. h& z8 S7 h5 _
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
: z; ~1 U& \& U) b9 F度。8 H, S1 f/ p! Y7 C# T& E. F: }
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
; K5 _+ i5 N" Q7 g& z运行速度。$ j! I- F7 ]- u; O1 d2 U
5 A0 L7 V4 `& \* i二、 遵守三条规则
6 r! B6 F- Y v- T0 T! `" l1 T' b Z9 C9 F
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
( e% I3 A( B) d* K+ d' S) ~h means it is designed
: t R; k8 f9 ^* J" m( Z5 }
9 A8 d* o2 G5 Sfor vector and matrix operations. You can often speed up your M-file c( p+ n2 V+ v! h: K* C+ h4 O
ode by using
- ]) D8 i/ ~" b. ^# W% Gvectorizing algorithms that take advantage of this design. Vectorizati
) e3 P S: o, j, A# e$ ^5 q6 H6 Von means converting
9 O* A: w# m# tfor and while loops to equivalent vector or matrix operations.”。改进
( J/ \2 m! _+ l这样的状况有两种方法:
* H2 P, {; H/ B4 j0 \
0 W2 v4 q* j$ b4 w3 v) D/ L2 va、尽量用向量化的运算来代替循环操作。如将下面的程序:3 f, u4 C. ]) V3 C* Y6 }6 v% r" w
' z+ t" E$ d0 w& |6 |
i=0;
* l' C" j' G. `7 n- k( yfor t = 0:.01:10
$ w0 W( @9 V; d. O) T- Si = i+1;8 f- ]/ [' m) E, n, ?- i# c
y(i) = sin(t);7 d+ s5 w# V5 x2 o0 u
end$ j! E; F( S D/ Q& K9 J
替换为:
/ R3 ^2 `) ?( {- X7 S: }% g* It = 0:.01:10;1 R! [% k& P, x' i! i2 Q. g
y = sin(t);
8 y& R: Y W* q. u; x2 R1 D \速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i) A: |' v8 }( L0 U8 k' x, m. m
permute、permute、* S$ M- @- |% U; y
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
, m0 _5 m3 o( z. w3 hum、ind2sub、
( Z9 e# d' d1 q* \0 }ndgrid、repmat、sort、sum 等。
8 G5 t& s" |' _5 x& s$ D3 A0 \* @8 s/ A0 I# b6 C! X$ `2 X
请注意matlan文档中还有这样一句补充:“Before taking the time to
: s- v o, |' t
+ {) o: `0 R! n" c+ D( g# zvectorize your code, read the section on Performance Acceleration.
6 i& H# _9 N. a; e3 vYou may be able to
6 H% e4 b- E0 M( T2 ^( @) bspeed up your program by just as much using the MATLAB JIT Accelera) F* l7 E% B [ O7 x' `, G
tor instead of. ^% d- y& M4 d7 I( i1 c8 Z
vectorizing.”。何去何从,自己把握。
' K7 Z1 h: E" z9 Q8 [8 [" ?$ A+ _' f: t# ^7 Y
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执+ x& ~) d2 s+ g( o& m3 p. G
行循环次数少的,/ p2 D9 d; r7 l
内环执行循环次数多的。这样可以显著提高速度。' z3 _: ~, q& } `: r! y2 U
9 i( S2 w/ D! O9 R. `
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on7 ?' m- z' D* Y4 H
es、cell、struct、
\2 ^+ |) P7 b: @, z1 d8 Arepmat等。
% @7 n5 h% q: [3 T7 }1 Hb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: I/ p/ }3 q5 q( F
( g/ ^% D9 V8 K3 UA = int8(zeros(100));
7 W" H! D5 `- J) e换成:9 e# C: A: \0 B' _/ C7 |$ ?' u
A = repmat(int8(0), 100, 100);1 o. }" _% h U! N' ~2 D, ?2 \
c、当需要扩充一个变量的大小、维数时使用repmat函数。
; a. s9 b" N" i6 p; n
$ B; R# X v6 b1 d3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。& M5 Y v* d4 i7 h. R8 X- r6 m4 ^, @
b、使用Functions而不是Scripts 。
! ^. V7 [/ ^% X8 \ ?
& r7 J8 W$ n) |0 }" g, o三、 绝招
5 C6 i6 E5 L) }" b4 g" }$ g
: C& s$ K8 [6 w# O! I你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
W: o, u; w9 k7 N; i9 L1、改用更有效的算法* X5 K% F% E1 M: u. }" [- R7 G
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
0 g X6 |1 F0 f, N
% e# k- \1 Z' I$ p& ^5 B/ c+ x关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++* k7 U% A: @% Y" S# @: y
语言文件,VC编译”。 |