本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
% T7 W6 `: e7 I
0 m/ M" Q9 S' U) D; I; t( S加速matlab运行的三重境界 加速matlab运行的三重境界
1 O) P& \1 I, r! l6 y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 O, j x9 Q8 U( s
%%%%%%%%%%%%%%%%%%%%%%%
) w' a1 M5 X% P7 q; R z2 u4 Q4 v一、 遵守Performance Acceleration的规则- C* { s- r3 O, n: R6 ?8 R/ [) f
二、 遵守三条规则2 g1 a* j% h; [" N- `4 a& }
三、 绝招
* D1 ~$ q! c9 A; p6 N2 S%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 x) u3 |# ^% F8 O%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则0 }5 g0 d) a S/ s) z! v/ C
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将+ z/ u C2 C2 F! F5 s+ O3 _ {# |8 z
其规则总结如下7条:
; K# }% H( C, w1、只有使用以下数据类型,matlab才会对其加速:
# ]2 R" ?: r% c9 j! z' a- p n7 _/ ~logical,char,int8,uint8,int16,uint16,int32,uint32,double! p' F/ ?! Z. p8 K" |
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu* `) i. O; j2 ~& B" y
re,single,9 B* @* Y4 O1 i7 i" z% W3 I. L
function handle,java classes,user classes,int64,uint64
* L9 ]! h4 j0 @" n" Q2、matlab不会对超过三维的数组进行加速。" L( s- U, P) c% t; Q6 n x1 q
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
2 A. ^0 J7 o. a来表示;
4 F, s) e3 s& G0 x7 l( Ub、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数8 L6 P4 l& B& J4 M" t3 c' `
据类型,只使用
6 e0 |; f) t5 p: `' [7 E: r三维以下的数组;c、循环内只调用了内建函数(build-in function)。
. O v9 A2 q, L8 Q2 v4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
1 V+ U3 M1 k' i8 b' H8 a加速运行。
' }6 V& Z: e$ S0 H* ^1 T* T5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:0 T1 |0 k0 @ V
x = a.name; for k=1:10000, sin(A(k)), end;$ s( G% I& |8 ^7 a# N" v3 T: n
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速0 i: x/ F6 ~4 V- o
度。
, Q4 L( ^1 u. A( g7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低9 L p8 ]) D- w0 K0 Q/ j {7 ^: ~
运行速度。: o1 y8 H# h7 S; x- M4 {
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' v, E/ ~* ?* s. m0 H8 h7 X
%%%%%%%%%%%%%%%%%%%%%%%
; X. ~# X6 Q" J. h二、 遵守三条规则
$ h, V- E2 v( [. c1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
" b- R& s; b* ch means it is designed. I7 w9 @" {; a/ n$ k# _
for vector and matrix operations. You can often speed up your M-file c
! Z3 O+ |) h1 v" w- \1 y; {ode by using
! w7 F: H: F; ^8 L# E* O: ~; [vectorizing algorithms that take advantage of this design. Vectorizati
. b3 _3 G0 t5 W6 A2 O* Q4 ron means converting2 G3 z& R; O* |3 s
for and while loops to equivalent vector or matrix operations.”。改进
1 g& r+ {* V7 b3 |$ O) m+ l这样的状况有两种方法:
) H3 @/ N4 v. }1 { M e- \6 aa、尽量用向量化的运算来代替循环操作。如将下面的程序:6 D6 U/ D# N% R1 h9 x; R) O: V
i=0;; w* `( Q) v1 ]: C) ^6 x0 f
for t = 0:.01:10
0 E( B4 i. _4 Q# M3 a; A/ vi = i+1;
. @8 P/ g0 ?! d$ f% _y(i) = sin(t);, h5 z8 G/ k3 P: Z3 x
end" v9 V% Z: x* {$ W2 E; `9 I
替换为: L: Y# V! m0 w7 t/ ^
t = 0:.01:10;: V3 s* [, H1 P9 D0 B8 I1 l
y = sin(t);
! _6 H6 D. C. r7 j0 T2 f速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
" g* P' j0 R) Q D: d% npermute、permute、( V0 m# f9 w: q$ v
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
/ P9 B$ c6 Q& k- _) T+ T2 Z. Uum、ind2sub、2 \$ W4 G: q% ?& S1 }, ]; i6 E7 z
ndgrid、repmat、sort、sum 等。2 b7 s, m+ d: E# ?( {" B1 }
请注意matlan文档中还有这样一句补充:“Before taking the time to+ I7 [0 Y* H% R4 b4 T' O* ^
vectorize your code, read the section on Performance Acceleration.
4 ^! ~, p: D8 o" H+ r+ A9 P8 bYou may be able to
; J! |9 u9 C/ b- @speed up your program by just as much using the MATLAB JIT Accelera
* i. ?$ [, b6 U% j3 d4 R Ntor instead of
5 p# I4 s; G; F! q9 c- h% Uvectorizing.”。何去何从,自己把握。. z) ?! Y" K) f( K
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执$ [8 B% T' I3 H
行循环次数少的,+ D. L; Z" ?7 Z+ G% m) ~* {/ ?+ |
内环执行循环次数多的。这样可以显著提高速度。
) J; W: d% L# F# h2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
3 P: ~( \5 t! @+ O8 O' q1 tes、cell、struct、
( U8 R: X7 j' x/ O; Orepmat等。
7 w! q; {* w$ K. L9 `5 ub、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:* ]( F5 O. ^) Z( ^) l
A = int8(zeros(100));
5 z( H; V; p1 x; N- ]4 V5 K' |换成:. _# L( C5 p# @: C
A = repmat(int8(0), 100, 100);
" Z( Z; C6 M0 S$ A3 p: ~. \c、当需要扩充一个变量的大小、维数时使用repmat函数。
/ G( Q* K: Y; y, d3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。$ v; B5 O( G8 _
b、使用Functions而不是Scripts 。
1 D- B4 M" R1 U# U, ^8 B1 ]9 L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 B9 E' C2 x- z2 Q" ]- C3 J
%%%%%%%%%%%%%%%%%%%%%%%
! y1 `1 `+ E) V2 {三、 绝招
% x& Z% c |% L$ f; U1 s) e你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
# B; r7 G- b4 ?5 F& E* [1、改用更有效的算法
2 d% z! ]! W/ w G3 i0 K2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
) {, L$ ]) x- _6 Z8 k# s+ H- _7 ^( [+ l: C j. M
来源:iLoveMatlab
) w4 v: f1 H n& ?! M( A* x! X x5 w9 s! ^) Z# n" l, h7 L! C
( A# B9 ~" r0 O6 }; q6 w0 J在这里本人推荐使用‘绝招’。 |