QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3764|回复: 6
打印 上一主题 下一主题

加速matlab运行的三重境界

[复制链接]
字体大小: 正常 放大
zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

跳转到指定楼层
1#
发表于 2004-12-21 11:00 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 2 f! U7 C1 p% N) _8 v6 W! u标 题: 加速matlab运行的三重境界 5 ?1 o0 ]7 |) y" B发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 5 \: W4 X) |; u9 C" T/ `9 I; S5 i3 ?8 @) l7 }" `) `, ?" m 加速matlab运行的三重境界

1 S7 b$ {" V# x5 l3 R 1 s* R$ X) j% P7 m

一、 遵守Performance Acceleration的规则5 Q5 n) D& }( h* }/ m # d" x( a! f5 z6 ~- v9 s8 Z+ j, ]关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将: _6 ]4 l% \/ V4 _& Q/ `) p2 J 其规则总结如下7条:' N0 g3 w, w! B3 x 1、只有使用以下数据类型,matlab才会对其加速:) U, F* y+ u0 U, E logical,char,int8,uint8,int16,uint16,int32,uint32,double # B9 z2 k* a# e1 i% f5 b而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu. I1 U: d5 M6 ]4 T% D9 K8 l( ^/ Z re,single,5 H: H( G: l# P* R! S! C 1 r5 V* a1 o9 q% q: W function handle,java classes,user classes,int64,uint64 7 M8 Z+ e8 p( m2 w2、matlab不会对超过三维的数组进行加速。; q" o3 N& V4 w9 T [; n2 l; z+ H6 | 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值8 `/ [, R: w( a( u 来表示;+ w* D" \* h0 b7 y1 D b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数0 R# d8 k& H8 j' p, i5 y0 u8 B 据类型,只使用; J9 c" [ [ E2 [, x# X# i% {0 ^ 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 5 i: o# b5 ?1 q" h% x* c9 u: F4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 / F% n0 u# i) b$ [- Q( W5 N% v C加速运行。 5 S$ s# O4 c9 a( I5 F5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:% z) X/ `4 N+ K) q6 I. H; q7 b x = a.name; for k=1:10000, sin(A(k)), end; * b3 Q9 `6 g" P2 D. ~& B6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速4 O4 Z0 n m* Q0 S: c. w! r- r 度。2 W( x. B6 X: M9 i3 W& ]4 s1 p1 q 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 2 f# }& m; w; N运行速度。 _3 u8 A( j5 q) P

G& s" H3 e- i! F

二、 遵守三条规则 / k T2 \( A: N0 n' C0 f/ P+ e% u * A; r/ u% d7 [; \1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic $ {) r. _7 P9 T+ v' [/ C) Kh means it is designed# K: n- j" J d; _' s: O& {5 s 4 e( n* `/ h4 ^0 L for vector and matrix operations. You can often speed up your M-file c+ ~( N4 L/ y. P3 p4 h& e$ ~ ode by using 6 Z9 E& G. p0 z! O+ M( Uvectorizing algorithms that take advantage of this design. Vectorizati * C; e% o1 O; q! F/ i8 Y+ Con means converting' U8 [5 h9 r X. T' N for and while loops to equivalent vector or matrix operations.”。改进8 _0 j9 Q3 i/ O0 c& ~: e 这样的状况有两种方法: 3 Q! n1 n+ X& ]0 r+ b" h- M+ B5 F8 N3 m a、尽量用向量化的运算来代替循环操作。如将下面的程序:. H9 ]6 j/ R5 R. x5 ?5 G* A! q4 @- C * ~; G8 ~6 U j: W5 C; p i=0; . L6 V( [1 D, ^/ b8 ufor t = 0:.01:10, h( x+ G4 {/ g: J i = i+1; : k7 b4 q) Q( D: b s. S by(i) = sin(t);, k* i# f8 W5 y: a5 P end / a; T0 `% v, K8 u替换为:+ f! J7 m" B7 @, k t = 0:.01:10; + Y* `& A# K; k4 n F) k& W% oy = sin(t); * w- o% ^, S( S- T; U6 o7 j速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i + f' ^7 T5 v9 `, L+ epermute、permute、 # w2 i P0 R. m' C, a9 _, jreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums - Q. C% N7 h9 U: ]" U/ [) c& Uum、ind2sub、3 d; T2 X/ M& X. A7 B ndgrid、repmat、sort、sum 等。: G4 a5 Q7 Y' _9 G " z% h; X" f/ S7 V请注意matlan文档中还有这样一句补充:“Before taking the time to& e; E$ [" \+ E A, A+ _6 n* m3 x" N' O vectorize your code, read the section on Performance Acceleration.4 Y8 M- Q" v2 N0 f6 G I4 z3 h8 e, p You may be able to9 G. Z* d# f1 j. t, I5 ~. u6 m speed up your program by just as much using the MATLAB JIT Accelera 1 |- l# Y9 F. d0 b qtor instead of1 w, n" y1 {6 W' U+ ~; c vectorizing.”。何去何从,自己把握。 \" G- x& g/ p% I" }1 |. S4 j2 ` b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执5 ?6 I/ i+ e1 e( K2 r& V 行循环次数少的, 3 ?6 Y; O& J6 d7 }: h5 K; U% ~4 y$ U内环执行循环次数多的。这样可以显著提高速度。$ _0 W/ Z" m$ k# o4 ~; | ! j8 l7 N) n- n3 M) \3 S 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on! B4 g+ ^* {" e2 F" Y es、cell、struct、 : X) M, t$ h8 [4 D: \2 I& E5 I, n2 arepmat等。- P7 L6 h9 U$ n) w6 Z! D b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: ' S- R9 `; E7 _; n+ ~. C 9 h1 q, Q& j- [: ]7 lA = int8(zeros(100));! y5 R2 ^) b& r- E6 s6 B 换成:4 {" _9 K8 d- b! w A = repmat(int8(0), 100, 100);3 D! \& c' ?% ~* E3 y# U( m, R& S c、当需要扩充一个变量的大小、维数时使用repmat函数。$ J' o5 D! ?" {2 \ * X& F& Z$ y1 ?/ y5 Y& C8 |8 t 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。- H2 [2 W1 Y$ T8 t) b9 @: l+ C' K& R b、使用Functions而不是Scripts 。 , {% `" a, F$ d% f6 `

% `5 S; k7 W/ T+ [ L4 V" N% G( I3 M

三、 绝招8 M, b; m) {! x% e7 { - s: A& w4 ~( Q& u2 l" A你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。) P/ L: i4 N( R- o 1、改用更有效的算法( w6 p/ P) z7 ^ w( U 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 " s% m P, ^+ L: m! _7 w: N) {; C/ B+ r 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ # O* T5 I+ X! b- d语言文件,VC编译”。

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

fup        

0

主题

2

听众

43

积分

升级  40%

该用户从未签到

新人进步奖

回复

使用道具 举报

ornewuser        

0

主题

2

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

注意

9 Z- ?. W F5 o

加速之前应该先测试: I% u, O% N0 L8 r 使用profiler可以获得程序各个部分的耗时" ]6 t1 h! R |9 D* F 如此就能高效的加速 ; Q5 J5 c0 X6 A' }" ~2 D

]5 J. B3 T; f- o

因为有的时候导致速度变慢的原因是逻辑结构不合理,2 l ?- d! G% C, g7 \ c 而不涉及程序技术

) C7 E" e, t; J! |

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

布赖        

4

主题

2

听众

134

积分

升级  17%

该用户从未签到

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-10 02:42 , Processed in 0.695577 second(s), 91 queries .

回顶部