QQ登录

只需要一步,快速开始

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

[转帖]加速Matlab运行的三重境界

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

跳转到指定楼层
1#
发表于 2005-2-1 19:34 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

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

' T! M- I, Y% c6 s3 W" @

CTerm下载文章: 紫丁香★. c5 N1 `& U& W8 r+ n9 H2 G 4 k$ T1 s, t6 G) |! E 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 3 P$ e& M- r9 r( \/ E3 o; Q1 L! W4 P7 G 题: 加速matlab运行的三重境界 8 |! \# c6 d( l& X2 p, Q4 Q$ P( v% ]发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)+ \5 }" }& E3 i3 o9 I $ i2 H7 Q. X% T( R* s" O" i0 i加速matlab运行的三重境界 - J" `% h; Z# k8 _: [% K' u一、 遵守Performance Acceleration的规则 - P3 X6 @/ [0 A `二、 遵守三条规则 % E" L* [! h+ k' ^7 @" ?) z6 ?三、 绝招

2 g) \- j( o) Y X. b# d

一、 遵守Performance Acceleration的规则- ^1 b$ u5 ?+ ?( ^- A 6 S" j, @3 f \8 e h0 h关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 y& v- [8 B# a4 N m7 c# `5 V 其规则总结如下7条:5 L, l4 F4 a" Z7 f6 } 1、只有使用以下数据类型,matlab才会对其加速:3 S$ l6 [" p/ o logical,char,int8,uint8,int16,uint16,int32,uint32,double 9 a* G5 G+ v$ ?- r# r8 w而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu 1 t0 W! A# J4 R d. Gre,single, ! T$ e, P6 y% b' j, `" }9 k* A$ Z function handle,java classes,user classes,int64,uint64 0 t/ ~* N2 _/ ^# H2matlab不会对超过三维的数组进行加速。 ; ~) i( q2 a t) |$ N' B3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值8 M, N0 o* g* a" i3 V 来表示; 8 M9 E' r6 y7 A" e/ }/ Hbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数: t1 A# f# f# O4 I8 |3 J3 x' G) n 据类型,只使用. A- f: x& a0 E0 Y6 V5 i* E0 } 三维以下的数组;c、循环内只调用了内建函数(build-in function)。. p w! t. x( K& f" B% q2 W 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将# Z ?$ I$ ~. ?0 r4 B0 H 加速运行。 & v% ]* U' A7 [1 m5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: - Z6 i% b1 c$ |' |x = a.name; for k=1:10000, sin(A(k)), end;" t3 n0 i4 D, | 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 ) b6 S9 x f7 r3 ?6 L度。 $ L: U* |( Z! D7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低% |3 `7 }: A& Y& K% Y5 [# y& S" f1 ~ 运行速度。, x! j6 F5 z) J ) r3 {9 Y7 x- h0 A( W 5 t. y6 E R, E, [2 F: |二、 遵守三条规则9 D7 O7 B4 e4 x1 G: _1 u" a! q$ g ' j$ s+ M: E5 _% W+ G 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic " }4 I+ V8 T& yh means it is designed F# I5 S, c- I: h % s! k5 y% B& ^for vector and matrix operations. You can often speed up your M-file c2 e4 ]( h7 U# R7 [6 `3 i3 F9 k' { ode by using , {8 k" h, b* l# Svectorizing algorithms that take advantage of this design. Vectorizati ; ^, d( ?% s& L+ bon means converting 9 J" U( y& p# C9 g+ r9 }for and while loops to equivalent vector or matrix operations.”。改进! `' i J, E/ t. D" _. r' { 这样的状况有两种方法:. G3 \1 O; Z( [) u$ r0 p% K" B |/ j* g0 Q+ h8 \a、尽量用向量化的运算来代替循环操作。如将下面的程序:/ S1 p. x" i3 E2 f / ]9 I3 y6 X" r& e3 X1 [1 d$ @i=0; 4 m2 f) y; |& R8 w6 |for t = 0:.01:10" M8 T4 Y: `2 i5 j3 T i = i+1; - \8 Q' k! U8 A: _- a1 g6 wy(i) = sin(t);) Q2 J' M( T3 b( H/ p end , ^4 J, L8 c* v! l( R8 W替换为: 5 m& E& N2 _3 ?; ]+ H& u- jt = 0:.01:10;$ ^& {% e( ^) P# ]+ z2 X6 m) N4 r y = sin(t);5 [; ~+ {0 _0 Y5 ]! c. ` 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i( _, ]; Y; ?& \# B& F permutepermute、 / P0 k0 g, D Q. P* N+ z3 mreshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums " @# J* l: X1 f: gumind2sub、 . F8 a1 Q- r$ f% G- G4 Tndgridrepmat、sort、sum 等。 ' f n8 X* A3 G - W6 f2 j1 ?; h, P4 q2 V0 F$ R8 v请注意matlan文档中还有这样一句补充:“Before taking the time to 5 z% y) Y; h: l! F- _% ^% q" Y7 }, @- t# j. c5 V0 \' c2 R vectorize your code, read the section on Performance Acceleration. 6 R9 ~( m4 X1 `4 Q/ xYou may be able to - Q [- Y! H& H' A" zspeed up your program by just as much using the MATLAB JIT Accelera' u, p/ t R' ]9 N2 n8 A tor instead of ; _, d& J$ r1 ]6 x2 ovectorizing.”。何去何从,自己把握。 3 p! G y" c- `. b& {; b5 o2 K& m S; P, f! V2 I b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执" Q7 Y r5 Y* R 行循环次数少的, 8 Q' D' a5 I- \内环执行循环次数多的。这样可以显著提高速度。$ Z; L3 N: H4 w& p $ b4 K+ {* p( F) W% n0 V 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on3 d5 e0 e% l0 a p4 K: g( E escell、struct、 # E7 g$ ^: d) T$ A- W* N0 u; Wrepmat等。& ]1 y: q9 i' K2 a* i b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:1 ~/ g. |4 k! \' ^& E( a- s + ~) U. O& D; a8 w3 B: ] A = int8(zeros(100)); + Z9 u8 N9 T3 f3 w* A+ y换成:$ {. X) [% Z; {- _; ^, I3 \4 X ~ A = repmat(int8(0), 100, 100);; d9 q a) ?4 D& a2 ?" ~ c、当需要扩充一个变量的大小、维数时使用repmat函数。! M, r) j8 o/ s. t, N % Y9 \- ] A8 M& W4 Y 3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。9 v+ V5 _6 E% z) `7 w2 D- n& J* v b、使用Functions而不是Scripts 。8 P( y$ g* N1 A1 L4 D, c- ] " W& ^. _, y- s1 r ' N j& w( H; f6 ]2 D. w三、 绝招6 a8 n( k- Y+ N, c / }% G! S3 v/ d 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。( T3 I6 j/ }! g# [; j* T% s 1、改用更有效的算法 8 h8 g- @1 m+ H- `2 d/ X2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 |9 |0 D8 U4 m / R0 ], p: s9 p 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ " `# R* _5 `$ ^" x语言文件,VC编译”。

* {' M8 X6 A# A4 ~

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
一颗沙里看出一个世界 一朵野花里有一座天堂 把无限放在你的手掌上 永恒在一刹那里收藏 --英国诗人布莱克《天真的预示》
aftermath        

0

主题

0

听众

49

积分

升级  46.32%

该用户从未签到

新人进步奖

回复

使用道具 举报

nightgril        

2

主题

2

听众

19

积分

升级  14.74%

该用户从未签到

新人进步奖

回复

使用道具 举报

damutou        

3

主题

2

听众

592

积分

  • TA的每日心情
    难过
    2014-5-5 19:58
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    群组学术交流A

    群组学术交流B

    群组A题

    群组B题

    群组C题

    回复

    使用道具 举报

    ghc_lwd        

    0

    主题

    2

    听众

    46

    积分

    升级  43.16%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    ethuo        

    1

    主题

    2

    听众

    84

    积分

    升级  83.16%

    该用户从未签到

    新人进步奖

    MATLAB编程是不是很慢阿??

    % @: N7 E1 o$ G9 ~1 Z

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

    回复

    使用道具 举报

    txj66        

    2

    主题

    2

    听众

    42

    积分

    升级  38.95%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    yirongshu        

    0

    主题

    2

    听众

    182

    积分

    升级  41%

    该用户从未签到

    回复

    使用道具 举报

    1

    主题

    2

    听众

    114

    积分

    升级  7%

    该用户从未签到

    回复

    使用道具 举报

    zzm        

    0

    主题

    2

    听众

    28

    积分

    升级  24.21%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-14 06:14 , Processed in 0.458085 second(s), 104 queries .

    回顶部