本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
& e- F2 d# I9 V) B0 z. w$ Y% ?; C, {2 `$ g! y; D9 G9 U( Q4 y6 D
加速matlab运行的三重境界 加速matlab运行的三重境界 ?( T0 X' E i3 `/ x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 p+ P' D e6 r; |# w6 W
%%%%%%%%%%%%%%%%%%%%%%%. R4 f! P/ Q+ O. h. ^3 Y3 h, J7 o
一、 遵守Performance Acceleration的规则1 n9 {) N2 d+ e( ~3 j1 A. h
二、 遵守三条规则0 A, e$ \5 {2 h: d' o% t: |
三、 绝招
$ _$ T- B3 X' I/ B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( a, Q) f8 v' T* |% l( k%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则2 _3 i- d& [, S9 ~9 \& m/ A5 g3 G
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
/ P0 P' J! Z) b1 |7 [其规则总结如下7条:5 t2 H! C7 ]" v6 g9 r$ s: L
1、只有使用以下数据类型,matlab才会对其加速:" X& w% a' e. f* ]2 `) Y
logical,char,int8,uint8,int16,uint16,int32,uint32,double
: Y# J/ ^0 d! m# v( c- f+ c; A而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
) h5 G! v! `+ {! P/ \3 Dre,single,
6 S. i3 U6 Z7 C2 [function handle,java classes,user classes,int64,uint64/ [9 t) X. z( P0 T
2、matlab不会对超过三维的数组进行加速。6 T( [6 _4 Q- w! E
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值( u" _8 Z3 [: J6 v; J7 i, @
来表示;
! o$ Z5 F# q* i$ @& mb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
+ A' b/ D4 U# q' C据类型,只使用. I" c, ~" c8 I1 |& B2 {
三维以下的数组;c、循环内只调用了内建函数(build-in function)。( y* a- s0 a' p/ `1 G8 K! M4 r1 R
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将8 c! {3 I; d! o8 h' g, f( |
加速运行。
5 e9 T6 T" A; B a. ] W4 Z5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
& e, B% a/ s9 vx = a.name; for k=1:10000, sin(A(k)), end;( B$ S3 `2 O7 X" X! R
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
* M! T2 ? ?! W度。
) O! p2 U; E' U5 `7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
" Y3 l0 \7 S$ K' X4 ^% z+ l3 p运行速度。 j0 Y' S/ l& v, A) u
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) U" C" G9 @ _9 t7 d5 r
%%%%%%%%%%%%%%%%%%%%%%%3 L* E6 ^7 @4 Z9 C9 r, q; S
二、 遵守三条规则3 I$ ?! G; ]6 y7 x J+ \* M' j, ?
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic9 M7 \1 R$ d9 ^" Q
h means it is designed# H. h5 k/ T2 t. N* T$ i! J+ s0 C
for vector and matrix operations. You can often speed up your M-file c
# t5 A; F' S; p; n* t# H1 w: C2 Zode by using$ p# Q+ B& E& F0 l* X0 U
vectorizing algorithms that take advantage of this design. Vectorizati
* Y7 l0 {- D. B" Hon means converting
) d' Y# Y. ?# N4 { T# ]( `2 Ofor and while loops to equivalent vector or matrix operations.”。改进
8 m; h* s! N4 [7 W* k( [' `9 S2 p9 \这样的状况有两种方法:. g9 q+ s. j# D/ i! }6 z. `" y
a、尽量用向量化的运算来代替循环操作。如将下面的程序:3 [6 ~! j; m+ m& ~* M
i=0;
( j/ W( ~; |8 Y( @6 y- T, |for t = 0:.01:10 n6 d7 Q4 \1 H
i = i+1;
, l. x/ [# I$ s9 j: dy(i) = sin(t);0 f; g" z1 O( B
end. {" W) a+ i' q3 b& a( \: D
替换为:: S {& Z& S" O
t = 0:.01:10;5 [* d! |9 V; H+ X
y = sin(t);# H6 D7 Q) {: Q! h& N/ b/ _0 a, E4 M
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
* P4 A' g$ [; G0 a& Upermute、permute、# O( {- |) y3 s1 R
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
9 ]" G4 k0 I9 N# s: C6 Yum、ind2sub、/ S* N1 O% f. K5 H% K; C$ M# _# c
ndgrid、repmat、sort、sum 等。" r$ Y$ X# ?1 y2 B e5 @2 J* |
请注意matlan文档中还有这样一句补充:“Before taking the time to
" O! O6 P* U ^; t1 Zvectorize your code, read the section on Performance Acceleration.4 |3 i1 D e- H! V9 s# B& [( W2 W2 [
You may be able to3 ~% h+ }& L6 \( ?' g; m
speed up your program by just as much using the MATLAB JIT Accelera
1 P4 `' O! |7 }7 s3 Itor instead of
1 e1 ~5 _% Y% g/ Jvectorizing.”。何去何从,自己把握。/ j& P7 B2 R& h& }' W# c, v
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
8 ]5 o/ j) ` n& v行循环次数少的,. C. U. @( H% p& g1 y- u6 {
内环执行循环次数多的。这样可以显著提高速度。. Q U' a& }+ `3 d! A+ ?
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on7 ]& G0 a8 g3 J% D
es、cell、struct、" A3 ?( h9 w( _) R) ~! |
repmat等。) V0 |6 \. j& h; x. V4 w
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
, w4 ?/ _, n4 e* R# H5 X, eA = int8(zeros(100));
- p T# D/ h% Y, X* A换成:
! {: Q: l0 d; I4 DA = repmat(int8(0), 100, 100);8 h! y% Y0 Z: b( X
c、当需要扩充一个变量的大小、维数时使用repmat函数。
- F, {9 D! Q8 q8 X m4 x. T3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
* t# {5 Y9 j- l2 c/ Z: Eb、使用Functions而不是Scripts 。
% ]3 N: ^9 Q7 t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; g$ `9 u) z: z5 Q- M# C8 Z%%%%%%%%%%%%%%%%%%%%%%%
% K% o& }" B4 u% q+ R r9 u' e) o三、 绝招" P9 }2 o0 R. m3 e' z c: q' u1 v
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。6 R& n' x7 t. o" t+ Q5 ]
1、改用更有效的算法: s7 \4 K8 _: m8 t" w Y" F
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
, p- M# x( s- l+ V
. u0 ]; D# `6 H 来源:iLoveMatlab
9 ^. V5 T# ?; o! y. U s. G
3 O( O% o; p. V+ X% q1 V. _$ w, x9 z( {7 q2 P1 V' _6 `* g
在这里本人推荐使用‘绝招’。 |