非常实用的Matlab编程技巧。可以试一试。
8 g% x7 h+ W0 a2 A3 W: HCTerm下载文章: 紫丁香★
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab/ F7 s. @7 `2 F! B' u1 ]6 p
标 题: 加速matlab运行的三重境界
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
加速matlab运行的三重境界
一、 遵守Performance Acceleration的规则
二、 遵守三条规则
三、 绝招
一、 遵守Performance Acceleration的规则+ [/ d* G# G U; n 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# j6 f/ k" ^2 z/ f 其规则总结如下7条:1 ^# I1 c7 _$ p- ^4 w 1、只有使用以下数据类型,matlab才会对其加速: logical,char,int8,uint8,int16,uint16,int32,uint32,double 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu" f5 c# ?, Z1 [; P re,single, function handle,java classes,user classes,int64,uint64' k2 q+ y7 I: O x. d3 g& Q 2、matlab不会对超过三维的数组进行加速。 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值7 S* ^9 P3 S6 Z 来表示;" m; ^/ b2 [2 y4 V! n" c+ p b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数) \" y Q/ a% d5 Y2 L 据类型,只使用 三维以下的数组;c、循环内只调用了内建函数(build-in function)。, j4 ?$ o1 |( I& S 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将; G' O7 W: Z5 ? _7 W! j/ I' E 加速运行。 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:% P' u% R% q9 i9 V( j. E x = a.name; for k=1:10000, sin(A(k)), end; 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速# y# O% O8 [% H+ p* } Y3 G2 g 度。 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 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 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 ode by using1 d _- { T& \6 P/ { vectorizing algorithms that take advantage of this design. Vectorizati on means converting- B5 p: K0 s" Z. d+ \' r6 D2 q8 ^ for and while loops to equivalent vector or matrix operations.”。改进 这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: * @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); 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i permute、permute、# K6 y3 `4 m- b3 b& D3 ~& O reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums um、ind2sub、$ m6 J D. c3 h6 i( s ndgrid、repmat、sort、sum 等。6 O9 } b$ t1 ]9 a% d 请注意matlan文档中还有这样一句补充:“Before taking the time to 8 {& 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 tor instead of vectorizing.”。何去何从,自己把握。. `4 j- ~6 ]% Q) e, z; L4 i. E b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执; _3 c6 u8 |5 ^8 |+ r( x0 L 行循环次数少的,6 Q2 g) B! f0 e3 e 内环执行循环次数多的。这样可以显著提高速度。 * y1 q) h0 A' j! a 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on; y- ~ k/ i4 L- _' W es、cell、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 A = 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函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 b、使用Functions而不是Scripts 。" ]2 L% x# Q7 B [ 4 S: |- Z; }+ ~7 N- f) F+ N1 \ 三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& E% e; P( d4 B$ } 1、改用更有效的算法 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。" B- G5 `% [; ^4 G' |/ W # w) I+ M: `1 O 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ 语言文件,VC编译”。
屁话的几招是够经典 呵呵
哇,我要试试看,新手上路,请多指教!
谢谢
谢谢了,
MATLAB编程是不是很慢阿??
5 F7 _. |: ~3 q比不上现在的那些高级程序语言啊?
好啊啊
转化成C语言最实用。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |