本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑 8 q! y3 o/ }. M% F$ a
! Z$ B: o& n% c B
加速matlab运行的三重境界 加速matlab运行的三重境界2 a8 [' ^$ I# Y" L* @, u
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: {4 g1 G5 T+ N$ z8 s& P! O/ d%%%%%%%%%%%%%%%%%%%%%%%( }6 P2 E- K# n2 w8 G8 e1 s# Y
一、 遵守Performance Acceleration的规则
3 D) d7 k9 J. X; I# b3 L8 Y二、 遵守三条规则. ~- _0 S$ G$ w3 [
三、 绝招
5 K; B1 N8 }: d2 q: q%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: ^8 t _0 _1 F7 c; j: A) F
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则
# i9 t+ M# V* E: x% V& g关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将* W5 `( o, T0 I' n$ `: M$ ~
其规则总结如下7条:3 P5 X! R6 y5 @9 O9 Y
1、只有使用以下数据类型,matlab才会对其加速:
$ `, b! q7 Y5 c5 H; \* [, blogical,char,int8,uint8,int16,uint16,int32,uint32,double3 [ n, a% T+ J: g! x2 f# K
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu/ u: |. D- O8 Z
re,single,) Q! t, f% B: i; N Z' L7 z# I
function handle,java classes,user classes,int64,uint64
% }' B P6 t* b2 o2、matlab不会对超过三维的数组进行加速。! @0 h, j9 `4 w( e( G4 ]
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
1 [( b' o8 Q3 P7 B来表示;8 O# T+ ^$ R. E
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
+ h/ T/ j! n& q6 f8 K/ n据类型,只使用) l9 Z8 l& y$ C+ P
三维以下的数组;c、循环内只调用了内建函数(build-in function)。 }- ]7 p2 W- |6 c' w# i1 u2 |1 ~& s
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
+ ]8 S' C7 M* n, o5 [! p加速运行。5 f7 |; }- ~; j( k1 a1 c* t) b
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
; t8 Z# M- g4 @) n3 d- sx = a.name; for k=1:10000, sin(A(k)), end;
) z3 Y) B& [: V. S4 N, r6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速/ N+ e8 U, b3 v- e
度。8 g& u- G; ]" p2 A' k
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
- K$ y, H$ P0 Z( J: P& d9 u运行速度。
+ v: X2 n3 a {# q7 Z2 j8 l%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%- b& ~7 k+ B* }( o/ S) f. i7 ^8 y
%%%%%%%%%%%%%%%%%%%%%%%
5 q0 F/ P1 j R; P二、 遵守三条规则
6 ] Q- s4 Q x+ S8 O1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic5 i% o7 y' F1 o2 Y5 B
h means it is designed
, i3 q, J/ v7 m5 {& `) ?" `for vector and matrix operations. You can often speed up your M-file c
, B. B2 e: m( m. y# s0 Z. gode by using0 s+ @( H) ^! E7 y& H( P1 f+ r* P
vectorizing algorithms that take advantage of this design. Vectorizati2 ~: Y' v+ J0 ]* J9 m' J- j
on means converting; u& [0 q4 ~- o/ Y4 V% z/ U
for and while loops to equivalent vector or matrix operations.”。改进
: B: `! {, q9 M0 B3 C这样的状况有两种方法:
/ h; Q1 Q/ g$ B$ ca、尽量用向量化的运算来代替循环操作。如将下面的程序:9 T/ U' Y" r- Q8 {9 y0 O( C5 j
i=0;& F9 T) j4 d6 i% ]. w
for t = 0:.01:10' i) H: l u, y" L8 h( h, t
i = i+1;
: l# M; V- @0 @+ U/ iy(i) = sin(t);: v) i. g# T2 R, N3 g$ N* b1 r
end
3 J% v$ v! c( G3 ]3 @替换为:/ e1 T/ N7 |* ~! u& b6 ~
t = 0:.01:10;, N4 [- M' w: o0 m, A+ i9 o' J
y = sin(t);
6 H: w5 r2 R: |9 P0 g4 \速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i, ?$ V' a+ _9 m. A7 A$ \
permute、permute、
5 w% e5 z; e$ R' E' jreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums. ~1 w9 Z) b! e. t+ |& i( L5 X
um、ind2sub、' Y1 o$ v0 e# @" j' Z
ndgrid、repmat、sort、sum 等。
+ G! o) K' ]! g/ M, I* t; I' {请注意matlan文档中还有这样一句补充:“Before taking the time to
9 K+ g0 _, v u0 A4 svectorize your code, read the section on Performance Acceleration.
2 C @3 y5 d5 Y% x# N1 `0 cYou may be able to, r L1 z" V6 g/ K O, a+ T
speed up your program by just as much using the MATLAB JIT Accelera
' a, D# b% f% ?# x! r% i! mtor instead of
& S1 T$ W6 j7 S: r8 P, K# V5 {9 q ivectorizing.”。何去何从,自己把握。
- M) q5 x5 `1 _- F7 db、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执+ n/ c; l( `; h
行循环次数少的,; t% X! v* R2 {$ H6 p; t
内环执行循环次数多的。这样可以显著提高速度。
' y. E4 \3 K# \1 w u+ Q3 U) n2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on+ F( j; [7 o+ s* |* H9 ?
es、cell、struct、
* w5 d1 t3 p! |5 Frepmat等。& B# y. A2 L* t# w0 X) p$ Q/ E
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
4 ]0 D+ v- K# Q- k! {# U8 pA = int8(zeros(100));/ @: b& s' {: `4 `. P
换成:
% U- u8 e9 ^$ C# S( \, {A = repmat(int8(0), 100, 100);
% \" F- _8 D) y' q: Y f) Rc、当需要扩充一个变量的大小、维数时使用repmat函数。8 `. i4 j. F/ v; o. D/ S% o* V9 }
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。# t8 u) x w A8 [! e0 r5 q0 E3 T
b、使用Functions而不是Scripts 。. b5 C, E* H2 D
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ K0 s3 m; B) |* I. m7 J( z, f
%%%%%%%%%%%%%%%%%%%%%%%5 D$ D' @4 D7 b# V1 F
三、 绝招
, d6 X7 X s6 p你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& B/ d- r+ z5 |; h& L( I& H: ]
1、改用更有效的算法9 s+ w _8 H# Q- V6 O0 Y
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
( D3 ^8 ^, D* ?) x% I% M6 `# X) I* ^' d# ], O, ~! z+ L
来源:iLoveMatlab& f) f; d6 T8 c S
3 U; h- k; Y4 q3 a5 j
7 f; r9 Z4 w* d! ^# H% H/ z$ A. ]
在这里本人推荐使用‘绝招’。 |