数学建模社区-数学中国

标题: [转帖]加速Matlab运行的三重境界 [打印本页]

作者: helen    时间: 2005-2-1 19:34
标题: [转帖]加速Matlab运行的三重境界

非常实用的Matlab编程技巧。可以试一试。

5 [1 }0 j$ a/ F- f; H1 p1 U

CTerm下载文章: 紫丁香★ ( a- a; v O" P$ q" e* K" ?/ w4 q/ F; L. g* p/ A) Z 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab $ P3 Z$ n& h% p8 A6 M 题: 加速matlab运行的三重境界& ~& C5 [) s9 j2 z 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 5 U8 M, Y5 u& }. Z1 L3 p# l# `6 M& n0 p( s 加速matlab运行的三重境界; B$ f/ R) \" j9 s" J 一、 遵守Performance Acceleration的规则 g& S4 ^2 ^8 ?二、 遵守三条规则 5 V6 }, ?" \8 t7 _0 G三、 绝招

4 S- J+ h7 D Y# x* |8 i1 l' a

一、 遵守Performance Acceleration的规则 % a7 a) }! N. V9 [! o 6 d7 p2 m9 b. f q( W关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 1 z! n: L: l* k$ S9 X& c其规则总结如下7条: & l3 S/ M5 L; d, ^1 Y9 ~$ a1、只有使用以下数据类型,matlab才会对其加速: ! W$ i* L7 j$ Zlogical,char,int8,uint8,int16,uint16,int32,uint32,double7 a2 h; @' P% X* e( I 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu ; ?" E* z- g/ y' I1 _7 i1 a! Bre,single,% m/ ?5 W* B& z7 O [9 t $ v* _& N! n% N0 ~) F function handle,java classes,user classes,int64,uint644 J T" _2 M- A) w6 \+ c9 p: l: h# ` 2matlab不会对超过三维的数组进行加速。2 k! \1 O) e7 }, W 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值& }. B5 x2 l/ N' f4 w0 p5 d! W* H 来表示;% \% t& Y3 V* K7 q6 ]% u. N bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 ! [) u( p' ?; A% o( ]3 O, S据类型,只使用% |* U! Y3 l' k+ F+ z 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 " T5 {4 K6 h$ Z% {7 g7 b7 N4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将% y, m' M: v8 ]2 b 加速运行。' L+ C, _7 c, {0 }+ s( r* X0 L 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: , `3 t2 w9 e) N& mx = a.name; for k=1:10000, sin(A(k)), end; # |& B3 D! w0 F0 h6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速3 Z/ c: Z7 {' b9 c 度。 + N8 v% f5 x" P4 m- u& A7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 S. F& l1 V: T. Z0 Y+ f 运行速度。 ) i6 A0 R4 r8 G8 V0 o( G8 A: p4 o0 J# A1 V) t) m. ~4 g" C ' m# G3 q# a5 F+ H0 i: ^二、 遵守三条规则! \+ {% B/ e/ B2 F. u) t + f0 m& ?5 J" w 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic1 s/ i7 t; B0 ]" r* O+ F5 H h means it is designed( y$ d P4 M8 ]3 s7 } : x( `" w: A) |# G7 u5 W$ I6 c6 Z9 _ for vector and matrix operations. You can often speed up your M-file c4 X8 {* R% l5 I+ N* L+ z& P7 [ ode by using / ~/ ^% b( `; ^+ R& Dvectorizing algorithms that take advantage of this design. Vectorizati* j/ z( L- d5 z4 D on means converting) i9 P' Z. L7 I* ?) [ for and while loops to equivalent vector or matrix operations.”。改进 ' B% @3 f# V" H5 m) Y9 W: V# m这样的状况有两种方法: & q, {$ D9 v" H2 S- ?4 E* o! A: }( I$ Y7 ^! e# h. L a、尽量用向量化的运算来代替循环操作。如将下面的程序: 4 O* C2 ]4 d* U; v, n: n 4 A3 a: c# [, ?0 P3 l* C: K; Ki=0;# f9 k, b+ A% `4 a/ L8 E! u0 J for t = 0:.01:10! [; |6 y, F" x, l i = i+1; ' z* r. l2 q' Y: S9 Y8 B; \y(i) = sin(t); " c7 d: i3 J( o! j8 M- Cend 9 |! K& t& b1 K替换为: + Z/ u% u( J, W; zt = 0:.01:10; - ? \4 Z4 n; ]6 [y = sin(t);$ A4 I1 A7 m g- R 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i3 L0 t& c9 A9 ]6 `0 ]; x permutepermute、1 ?/ b/ V; Y5 x reshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums ) e. e. B! p+ I @( q5 t, [( qumind2sub、 & s/ u0 I3 v; N/ Wndgridrepmat、sort、sum 等。# I: y! _" t n8 y, D ! J8 e& M" s9 E5 Z: ] 请注意matlan文档中还有这样一句补充:“Before taking the time to . O% b1 r) \+ n- W. U \2 U3 S # c1 L, [# R8 Q% }% ?1 P1 i5 ^vectorize your code, read the section on Performance Acceleration.2 b1 ^ ~( j& |9 C% ~' V; S You may be able to6 \/ `; C; ^* i! _# |3 |, Q speed up your program by just as much using the MATLAB JIT Accelera d7 B* i, ?# L! [! F! ]5 Gtor instead of # d$ r" ~4 d+ i S1 F- @5 [ avectorizing.”。何去何从,自己把握。) y1 S% ?; G0 L; x1 r ! T6 l8 N% F% ]6 yb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 1 u- G y- V1 V" y7 V6 O行循环次数少的, ! o8 }. D$ K" Q* L2 e2 }内环执行循环次数多的。这样可以显著提高速度。! O, d5 v/ g3 T* y 8 c6 u8 l9 X3 ]9 v7 |) Z( k# U2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on / [6 u1 G' Z" S9 z/ y& Pescell、struct、 2 x: e+ s) U2 h" ~8 c: P5 Krepmat等。 * k& U1 @$ m! a# k) X2 `; wb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:- H* W3 P% l' @5 n 7 K7 q! s6 x$ z% \ A = int8(zeros(100));6 `% U; E- n7 m: ~ 换成:' V- k3 J- D; b2 d A = repmat(int8(0), 100, 100); % G7 u( E$ }! t& m/ }/ \+ uc、当需要扩充一个变量的大小、维数时使用repmat函数。 : d: y) F! ^* b* ?% U/ W0 Z4 S , b& K4 J* e8 T8 z3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 O% h4 e# E$ ~! }8 c* u5 `& Db、使用Functions而不是Scripts 。+ p/ F/ S" M9 D; ~ ! z1 |: N. s# q; B" l0 s 0 u: i0 c* z$ o# H/ G 三、 绝招% M& P8 x w" e; k 1 E& `" s; D4 C" K 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 9 g; T. G6 [; G# b% f/ x1、改用更有效的算法 / g. u% E8 { q% _ X5 N" V. K2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。& ]# ~* a1 |5 C5 L 4 X8 A `$ h3 B/ d; y* ], F 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++3 H: b' Y8 B1 D' u& c 语言文件,VC编译”。

; w5 x# z& K D) V( Z* ^) v


作者: aftermath    时间: 2005-2-2 00:01

屁话的几招是够经典 呵呵


作者: nightgril    时间: 2005-6-9 22:28

哇,我要试试看,新手上路,请多指教!


作者: damutou    时间: 2005-7-7 12:46

谢谢


作者: ghc_lwd    时间: 2005-8-9 14:38
学习学习
作者: yirongshu    时间: 2005-8-16 20:26

作者: 英雄本色    时间: 2005-9-8 15:54

谢谢了,


作者: ethuo    时间: 2005-9-13 12:12

MATLAB编程是不是很慢阿??

6 L9 V4 z/ b# |' z; C8 l. ^: @; j

比不上现在的那些高级程序语言啊?


作者: txj66    时间: 2005-9-13 12:50
标题: 好啊啊

好啊啊


作者: zzm    时间: 2005-11-17 15:34

转化成C语言最实用。


作者: echo5183    时间: 2006-11-29 14:53
顶,有用!
作者: elinor    时间: 2007-4-19 13:57
新手,看不懂也[em06]




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