QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

7 i. m3 o! ^- i5 o T8 V+ E5 B1 r

CTerm下载文章: 紫丁香★' j6 P# A3 A6 O& K. E ; {0 ?% a0 O$ G [, {4 {! d 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 2 h. Z9 F" t% | 题: 加速matlab运行的三重境界 1 U" _; c, [( H+ b5 |- o发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 5 X# _1 [1 X0 N. m4 b: C* V : w, k5 g) }& ^5 ~9 g. r. x1 F加速matlab运行的三重境界 5 T+ K$ \5 q: D1 J6 q4 R/ H一、 遵守Performance Acceleration的规则0 N5 i6 ^4 c* ?2 } 二、 遵守三条规则) E0 f/ H" e, j 三、 绝招

# X- N1 K, G _8 k) [% ?

一、 遵守Performance Acceleration的规则 7 B: ]6 z4 k1 j( i/ U % C5 Z9 O. U2 v+ p5 u5 K" e关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 3 E4 k5 f0 P7 t+ G& ?4 T其规则总结如下7条: / Z9 ]1 R: _, `5 X1、只有使用以下数据类型,matlab才会对其加速: & a" {* J. i6 o% o. D' x! J9 N6 V2 ^logical,char,int8,uint8,int16,uint16,int32,uint32,double: i& c* V% w) a4 m E3 a- X 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu4 x4 w" m( U1 @ re,single, : N/ }/ B5 ?1 |+ e : t9 z6 g% M9 j& b: d1 W4 Ifunction handle,java classes,user classes,int64,uint64 ; V4 V+ \0 K" o2matlab不会对超过三维的数组进行加速。$ N8 S- P! J: ~7 I8 s 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 : [: P+ M9 F% W. V( O/ b' s& h/ @来表示; 2 E, [# [5 G3 s% @! q1 ?$ sbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数+ e. O) V* K) B' m1 B 据类型,只使用6 D. j- A. i; B- q! R8 Q 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 3 \- d6 r! ]- E1 I0 C9 `5 O6 m% J: u8 ^4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 ' Z; A; q" a$ g2 R: T6 i加速运行。: s' j7 |, W8 @" c$ J0 C 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:7 a5 J" O- \7 {" P x = a.name; for k=1:10000, sin(A(k)), end;( h$ C; `1 V. [- { 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 % ~5 I4 f0 k+ \# z) w2 v r度。- ?! | X0 N& F& ]2 H n 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 / ?" i1 H8 U' [% J$ ^0 C% T运行速度。0 }. Q: r6 `) w) m 3 [) M( N7 B) ~. O* ~3 a; G' l, \8 [! y M/ N# V1 ~ 二、 遵守三条规则 8 `. R( n, W, |, a) [' `& n# L# ~2 M5 [) N7 j 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic* J" r, m( B$ r D h means it is designed: q2 ^ j0 K2 m0 h ' `7 \+ K6 U2 s K) b( }for vector and matrix operations. You can often speed up your M-file c 7 \% j# f, X4 D: q/ @ode by using 0 S9 @7 e% _5 F% S3 k7 Zvectorizing algorithms that take advantage of this design. Vectorizati 5 G2 Y( l! P9 o/ u: h. eon means converting 3 N( X, t6 k, B8 i* nfor and while loops to equivalent vector or matrix operations.”。改进 : e1 C& d8 a9 T- V这样的状况有两种方法:2 {+ c# V- j- I$ R9 \6 w9 p & R$ X. S) F: M a、尽量用向量化的运算来代替循环操作。如将下面的程序:: ~/ g$ f% @* o; K8 o5 L & e- w# j S1 S6 Z6 {' O# y u i=0; k& _4 w: b5 |, Dfor t = 0:.01:10- j3 I7 F( t' Y6 x3 K i = i+1;0 S9 U4 g8 f' I. t3 s3 z5 _4 y2 w y(i) = sin(t); 1 e R# j7 K0 L7 n7 K& x4 gend3 l) p+ {3 Q9 |! [& A* m& O! E 替换为:" ]7 P; h$ G" @5 t, ?+ i t = 0:.01:10; . k* G/ P, @# q' I: K/ A4 Iy = sin(t); 2 Z; e2 r2 z4 W速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i A( U4 X U: |0 [) j permutepermute、, B/ G" k9 }0 l. s1 m2 u8 w9 S reshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums ' Y+ G: s5 A, h4 E1 |umind2sub、 J" c( W0 M6 \: E- Zndgridrepmat、sort、sum 等。 3 Y1 Y$ Y$ b0 W. u; K$ Y7 I4 X/ s$ b! c# C! k. P 请注意matlan文档中还有这样一句补充:“Before taking the time to5 ?" ^7 v7 L; j O $ }$ V( `2 o s* v. L& o# Svectorize your code, read the section on Performance Acceleration.6 d) M/ x6 x/ |7 b7 i7 c You may be able to ( W1 w! T1 ], d4 w6 wspeed up your program by just as much using the MATLAB JIT Accelera 1 @) [8 R3 C5 ?9 f% W9 c0 h; ~tor instead of ! }- s5 M) a) jvectorizing.”。何去何从,自己把握。 1 `/ F; T1 h5 u2 |$ e+ \* ]; |, m" f, S6 ~7 T' B b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执' l! ~1 B) N4 m+ A 行循环次数少的, & j* {. w) a) O% |2 N2 s内环执行循环次数多的。这样可以显著提高速度。 6 g1 h: [0 d5 U0 U- m# P) S* L : @0 ^* \4 k" o ?6 i0 P2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on " M# g8 l! E# ^" xescell、struct、 " Z# Y1 A& j" ?repmat等。 ! `7 g5 N( \( X) {% K* E0 n* Fb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:. m) y% L0 U) r; G% t6 ?& I0 n 2 p; D$ o$ U: G A = int8(zeros(100)); + d+ q( L, V' \0 h8 W, s$ [7 G换成: / ~! ~, k. g' WA = repmat(int8(0), 100, 100); ! v* S( L8 e+ `- qc、当需要扩充一个变量的大小、维数时使用repmat函数。8 c8 D7 d1 P& A * n( u# I3 c, [/ {3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 ; u: s! S4 Z2 Z, x0 t M4 Wb、使用Functions而不是Scripts 。 2 n8 b. y( i% U6 @7 i/ z- m$ d: H9 T z+ X0 q0 X + I, i0 v9 L' C* I 三、 绝招 6 y* Q# l. B% A1 ~7 v / E5 U: i3 F' v你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 2 } Z0 [) V5 W0 K7 \4 l V! e1、改用更有效的算法 ' i1 A0 I" C, i1 r2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 6 D( z) U0 a5 H" R. S. N ]" Z, @% ?' H% R$ M! S3 W' u! W 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++3 z% w( W5 d4 S' O2 u 语言文件,VC编译”。

9 W! T7 Q7 I' b' `- U

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%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    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-10 10:35 , Processed in 0.428534 second(s), 104 queries .

    回顶部