数学建模社区-数学中国

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

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

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

8 g% x7 h+ W0 a2 A3 W: H

CTerm下载文章: 紫丁香★ * f0 C( x. H- \+ ^) } d) s- L4 `, h' q- T7 j% r5 v. ?发信人: fork (撒哈拉沙漠的沙), 信区: Matlab/ F7 s. @7 `2 F! B' u1 ]6 p 题: 加速matlab运行的三重境界 ( p; u4 ?% u0 Y( \# i发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) # H( Y) m( i1 u! T 7 ~! `8 ^( p& v; _6 X. T2 f加速matlab运行的三重境界 + m+ O% K! \% ~2 ~; S' ?8 ?% m2 G9 _一、 遵守Performance Acceleration的规则 3 e8 L( H/ y! r% ^二、 遵守三条规则 5 a% E4 Z- [$ }7 e3 \三、 绝招

0 `# O1 ~, a% J. u; p/ k* x) h

一、 遵守Performance Acceleration的规则+ [/ d* G# G U; n ) U3 ?1 s4 S/ r; `- N关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# j6 f/ k" ^2 z/ f 其规则总结如下7条:1 ^# I1 c7 _$ p- ^4 w 1、只有使用以下数据类型,matlab才会对其加速: % y: f/ s3 J! I& O: @0 q/ b' i# vlogical,char,int8,uint8,int16,uint16,int32,uint32,double # V- }& o% C8 i; @2 g1 j6 O; w而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu" f5 c# ?, Z1 [; P re,single, $ H% s/ U B9 n5 X9 v $ i6 h5 ~0 T+ Q f: Y5 Hfunction handle,java classes,user classes,int64,uint64' k2 q+ y7 I: O x. d3 g& Q 2matlab不会对超过三维的数组进行加速。 $ ^; D2 @3 q s3 C, f( D6 S! O3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值7 S* ^9 P3 S6 Z 来表示;" m; ^/ b2 [2 y4 V! n" c+ p bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数) \" y Q/ a% d5 Y2 L 据类型,只使用 " d W' X: J x }- k: q8 G三维以下的数组;c、循环内只调用了内建函数(build-in function)。, j4 ?$ o1 |( I& S 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将; G' O7 W: Z5 ? _7 W! j/ I' E 加速运行。 # e# V u1 E3 e3 J d5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:% P' u% R% q9 i9 V( j. E x = a.name; for k=1:10000, sin(A(k)), end; $ |! p9 T# [- G+ s" }6 `: |: U6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速# y# O% O8 [% H+ p* } Y3 G2 g 度。 ' @4 [8 H/ r# L7 |7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低- a' G& n/ D6 k 运行速度。4 e y. _% j1 @/ @5 q; J0 Q! l 8 B! s3 ?, l( [6 B: O: a2 Z 6 v4 h) |/ l0 H 二、 遵守三条规则2 ~) N @& { g. D# j + \7 u! \# Q" S" J1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 3 `5 M! b- ]; W: k" U1 M' u$ [% }h means it is designed& E% P! z! \. b) u- Z4 H1 v 9 O% Z3 l; o4 Y& g* L' b! y. z0 c for vector and matrix operations. You can often speed up your M-file c 2 z9 b* P( q _- q1 j; lode by using1 d _- { T& \6 P/ { vectorizing algorithms that take advantage of this design. Vectorizati 3 O4 N' R7 ]0 l* y# N; }on means converting- B5 p: K0 s" Z. d+ \' r6 D2 q8 ^ for and while loops to equivalent vector or matrix operations.”。改进 % Q, a! z5 F! |. W. K# m1 W* Z这样的状况有两种方法: 2 U; ?3 x2 T. T6 ~4 _/ g8 y4 f ( k' e" S, i) N1 W0 {8 Q- ^) r; R$ Ka、尽量用向量化的运算来代替循环操作。如将下面的程序: ' E' V1 r* f, ^; w+ y( N+ N* @4 \9 X) D. g6 H i=0;6 b) ]6 |3 h* D! E5 p( G8 ? i* ?; f' Y for t = 0:.01:10/ ~, @0 h+ U1 r/ n Y i = i+1;0 c& n( _9 m) s2 p) m y(i) = sin(t); s. h g3 F# a" t% W end: {/ n' ?9 d2 v 替换为:, z" t8 Y% F* y3 X t = 0:.01:10;3 x2 u' C7 u1 v y = sin(t); ' }/ v2 L; P7 w# s* Q速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i # M. k( ^7 B3 U! X8 upermutepermute、# K6 y3 `4 m- b3 b& D3 ~& O reshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums 0 m2 b g& m0 w+ J3 V$ gumind2sub、$ m6 J D. c3 h6 i( s ndgridrepmat、sort、sum 等。6 O9 } b$ t1 ]9 a% d 4 h* n: `" g& U' O8 s( t请注意matlan文档中还有这样一句补充:“Before taking the time to 3 j: n, E, i m5 C" ^1 F2 X0 e8 {& I5 j& q; x) g3 J# n vectorize your code, read the section on Performance Acceleration.: n) q s+ R( H# A You may be able to% |6 r& L( h! W speed up your program by just as much using the MATLAB JIT Accelera ' X2 G( ~. H P+ V* ]tor instead of 3 j# j3 d% U6 I( m$ P& j, pvectorizing.”。何去何从,自己把握。. `4 j- ~6 ]% Q) e, z; L4 i. E . h# P0 u# V& T# g- nb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执; _3 c6 u8 |5 ^8 |+ r( x0 L 行循环次数少的,6 Q2 g) B! f0 e3 e 内环执行循环次数多的。这样可以显著提高速度。 3 O; S! A* n5 h0 z. V: i* y1 q) h0 A' j! a 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on; y- ~ k/ i4 L- _' W escell、struct、1 v0 c: m" l) Q( P repmat等。0 t, U' x) ~8 F$ V b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:$ O) R% C, Y: |5 r- q9 [6 I ( O {. r6 r! Z0 A+ B$ j' QA = int8(zeros(100));0 o( e: Z% m4 K) n2 [+ q0 v 换成:$ t8 N% O: r; X" H& O! }& c A = repmat(int8(0), 100, 100);' g/ z) z7 k) @( |3 f c、当需要扩充一个变量的大小、维数时使用repmat函数。 2 \) x9 B1 X) S3 {5 j. X4 s 9 E$ A s( m( v5 ?; m4 Y3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 + M% W+ F! g4 S( Sb、使用Functions而不是Scripts 。" ]2 L% x# Q7 B [ / `: }9 C4 Q1 O3 s" w0 v4 S: |- Z; }+ ~7 N- f) F+ N1 \ 三、 绝招 " J# i T7 O! j 2 L3 e X4 I; C* n. ^! \& M7 [你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& E% e; P( d4 B$ } 1、改用更有效的算法 9 f$ Z% W: s* Q; [0 ]- f2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。" B- G5 `% [; ^4 G' |/ W # w) I+ M: `1 O 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ : |7 ?0 _; a7 m) a" U5 J2 A* f语言文件,VC编译”。

* W# ?7 `* T; W1 l


作者: 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编程是不是很慢阿??

5 F7 _. |: ~3 q

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


作者: 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