数学建模社区-数学中国

标题: 【转载】加速matlab运行的三个境界 [打印本页]

作者: 厚积薄发    时间: 2010-1-25 22:39
标题: 【转载】加速matlab运行的三个境界
本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
, C; n: Q5 e) v9 T( P
/ B: M7 t8 a1 K3 r' j- H- d) O加速matlab运行的三重境界

加速matlab运行的三重境界
8 P8 ]9 h7 ?$ n" i+ Q0 [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: _7 N: w/ ^8 L6 D& z5 w3 ^/ p# }+ a
%%%%%%%%%%%%%%%%%%%%%%%3 M  Q, L: S& W( P  P
一、 遵守Performance Acceleration的规则: b2 @6 U; f$ u( D
二、 遵守三条规则
# B' ?1 l& R! q! P* v  k三、 绝招
; T& m9 }& H; r$ o/ B- T%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
" S: ]" t' Z& S8 i%%%%%%%%%%%%%%%%%%%%%%%

一、 遵守Performance Acceleration的规则1 k$ j- o7 N) f% N$ u4 \7 l
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将, G& k$ L9 c4 o, |+ p, \( [
其规则总结如下7条:% K: d7 c' u' x4 w, f7 c
1、只有使用以下数据类型,matlab才会对其加速:3 K$ H7 s( l5 W8 h
logical,char,int8,uint8,int16,uint16,int32,uint32,double
% s* X) e- t+ c7 v0 N
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu7 U  a* @9 A' M3 j
re,single,7 ~4 C; c, S) R5 }) o; \( y
function handle,java classes,user classes,int64,uint64
5 x+ q4 T8 j+ ~, l# x2
matlab不会对超过三维的数组进行加速。
+ U+ ?0 I9 ^6 k3 P
3、当使用for循环时,只有遵守以下规则才会被加速:afor循环的范围只用标量值# n5 f* Q0 {2 Y" H+ O6 I% q
来表示;
. X- m- N/ K7 ^7 I5 \bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
: E5 S; u- E. J: A+ k# s据类型,只使用- v7 F$ B* q. |$ x
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
4 @# N& P# n$ ~, }$ o4、当使用ifelseifwhileswitch时,其条件测试语句中只使用了标量值时,将
$ F! p' w- r! g% h加速运行。  f2 f* [- [8 m; w+ L" u
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
& V9 K& e& g5 t% @x = a.name; for k=1:10000, sin(A(k)), end;- ]6 o+ K1 O8 Q! O9 t6 O$ C6 {
6
、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速5 _2 o$ P" D0 V7 w" j6 ]9 F- h
度。7 n# ]. k$ w* A1 |# P; A8 c
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低) w$ H" u  h) ^- I  `( x* k. c
运行速度。
1 j: k/ w: d. _! C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ e. M6 |3 i+ D; [% I9 z%%%%%%%%%%%%%%%%%%%%%%%
! M3 c! U/ o9 m6 y& x7 x4 G- Q
二、 遵守三条规则
$ ^, H" [; W  r( ]- W1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic! I) R8 x/ i" i" Y7 {7 }4 h3 d
h means it is designed) o: i  z! P3 c! C
for vector and matrix operations. You can often speed up your M-file c0 @9 z1 [9 W- Q/ |* V! K
ode by using
% N3 Z2 F) x! n; dvectorizing algorithms that take advantage of this design. Vectorizati  ^! O7 Q+ M+ H& p) N1 @
on means converting9 W( h5 s1 s3 b. K$ K
for and while loops to equivalent vector or matrix operations.”
。改进

1 h. L" ?# A) [9 b7 X1 J这样的状况有两种方法:/ V: y- p. t0 i% s# x
a、尽量用向量化的运算来代替循环操作。如将下面的程序:, A7 C) ]1 K& `6 Z% V! ]
i=0;
3 A0 D7 [9 J& w2 gfor t = 0:.01:10  Y! l* i, N( c% n
i = i+1;$ q  e# H' }* H, p1 `! E
y(i) = sin(t);" e  J5 o3 i2 w) A3 F$ \
end
# W# M' S+ K1 [2 E/ i6 u! P
替换为:! `  ?( J) H, k$ N0 z3 g
t = 0:.01:10;
1 D7 ~) {+ g8 K, ]y = sin(t);+ c0 C/ t$ [7 M7 B
速度将会大大加快。最常用的使用vectorizing技术的函数有:Alldiffi
% P! _4 Q1 R5 x! b! ?" Z- [permute
permute

+ s$ {% V2 @: l3 ]' B0 Ireshapesqueezeanyfindlogicalprodshiftdimsub2indcums
2 W/ f! l- x5 j' {, p8 cum
ind2sub

- p. ~. x3 _/ m' F. x. j1 |% G+ ?& k! Rndgridrepmatsortsum 等。
2 J1 n% l; N) W) A$ j请注意matlan文档中还有这样一句补充:“Before taking the time to
8 t+ l: \7 {' t! wvectorize your code, read the section on Performance Acceleration.; J# G0 a- Y' O1 u1 L/ j
You may be able to
0 h/ @7 T) S6 i2 Mspeed up your program by just as much using the MATLAB JIT Accelera' S! i9 o8 m2 v) M: [; Z
tor instead of
- D0 X* I' d- t% A0 h: ^( lvectorizing.”
。何去何从,自己把握。

3 v8 s/ E4 ?9 B  v8 o/ L, S& q5 vb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执' X. h  _$ R6 Y2 {/ D; ^9 l/ F
行循环次数少的,
+ H9 k" w$ E, X内环执行循环次数多的。这样可以显著提高速度。2 P; h& s3 E9 @* ~& h, x& n
2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeroson
' g3 ^4 Q  f( G; Hes
cellstruct

" R7 g& h0 s1 grepmat等。
! X6 ?0 m1 `* P8 l) Pb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:! o, A6 l& ]' g! g$ g
A = int8(zeros(100));
: W0 k' P# _9 _5 Q# X) `4 E8 ]& a
换成:
+ z0 Z) a! [4 [  z0 W7 O* X) i3 tA = repmat(int8(0), 100, 100);# t. P& K+ _& W& N- p% P2 R
c
、当需要扩充一个变量的大小、维数时使用repmat函数。" i0 p# w* h. h
3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
9 ~# B( I6 P  P( t& `b、使用Functions而不是Scripts 3 l9 D" q+ ^; U' k
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; E+ `! t8 E9 Z
%%%%%%%%%%%%%%%%%%%%%%%
) e" l8 w7 [- a1 ?) M
三、 绝招
& A" |4 k  P5 b1 M你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
" B; k8 r& ~0 L8 j1、改用更有效的算法: _1 ?% }5 ~/ t, M$ n' V" f
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。

- C/ j# _( U/ s0 h

! Q" P% u% i/ M5 |+ ?  来源:iLoveMatlab# X+ W) a4 Q5 R6 U3 W

5 d6 Y+ P- v$ @) J$ J) d0 I% P# H) f2 Z
在这里本人推荐使用‘绝招’。
作者: XINGQIBIN    时间: 2010-1-25 22:42
请注意matlan文档中还有这样一句补充:“Before taking the time to
作者: HSinB    时间: 2010-1-25 23:40
收藏了,感谢楼主!!!!!!!!!!!!!!
作者: D-lin    时间: 2010-1-26 00:18
好牛啊 从来不知道的 思密达 。。。。。。
作者: leo12ok    时间: 2010-1-26 08:50
相对于楼主,我更倾向于绝招之外的方法,呵呵。
作者: xiaoding123    时间: 2010-1-26 08:56
必须好好研究一下matlab了~~~~~~~~~~~~~~~~
作者: isnowfy    时间: 2010-1-28 18:33
mark。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
作者: yansichong    时间: 2010-8-26 18:32
收藏了~~~对现在建模很有用……我上次写的程序就运行了N久都没出结果……郁闷……
作者: schnee    时间: 2012-2-6 17:26
顶!!!!!!!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5