QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

; b$ e0 w7 b# l. z8 Z' h1 M$ N

CTerm下载文章: 紫丁香★; E6 e1 G" b6 ?5 G & n- r& s$ B2 D( V发信人: fork (撒哈拉沙漠的沙), 信区: Matlab1 X- c. [6 g* T1 a 题: 加速matlab运行的三重境界5 f* z3 W8 v" b/ f8 @3 O$ y7 B) w- m 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)8 E/ n( t i4 c2 I & j7 b* U9 D- z* Z 加速matlab运行的三重境界! L6 Y9 Z: b: p! R( x 一、 遵守Performance Acceleration的规则 h3 P# {# u5 q& C) @9 `二、 遵守三条规则 ; K# d/ T0 p/ x三、 绝招

+ ?+ A- ~, U' k2 D

一、 遵守Performance Acceleration的规则7 a2 R2 W5 u( I: ?" T+ f 2 @ U) d2 `0 o& w" h. ?+ A" n关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将+ d8 s0 A' \6 ?7 w5 C 其规则总结如下7条: , \: B& N7 e4 ^7 N5 O1、只有使用以下数据类型,matlab才会对其加速: , S0 w- n" s, \. J0 Z/ [logical,char,int8,uint8,int16,uint16,int32,uint32,double9 b- [& N5 A( ^0 w8 v4 \ 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu/ R7 }' E7 g* m$ U8 e re,single,7 p8 d1 _' @ C: K6 W3 G 0 O$ c9 [# A% t% V7 i function handle,java classes,user classes,int64,uint64 7 [0 E0 Y% |3 m* Q6 h! r Y2matlab不会对超过三维的数组进行加速。5 L1 d9 Z4 x2 R! g) ^) U; G 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 7 t& z9 ]2 J6 x; n' o5 f6 X- Q来表示;5 H. D( ^* n4 o: I2 E7 u bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数7 P c$ T2 s' t5 z; h 据类型,只使用 9 i, n# @0 h0 u三维以下的数组;c、循环内只调用了内建函数(build-in function)。! q* p* S2 g# l; D V1 b 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将: f8 d0 |6 H8 _! l1 N6 v: v 加速运行。, S/ m& H& g2 D; j% L8 Q$ _ 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:6 p& N# o* F1 S& b7 B7 K$ f9 X x = a.name; for k=1:10000, sin(A(k)), end; 4 s1 R2 ]- B# ~! f. D* q6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速) |6 t3 y/ b0 H7 c1 h 度。 8 ?% v* Z/ X: ]9 x. w$ s7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低* t: A/ T* i$ P- C# l( C 运行速度。( t/ [4 O D3 L0 d7 o$ `& x / |9 A1 G& \" H' ~2 j; n5 S) c0 L* T: V 二、 遵守三条规则 ! d7 O$ i" ^' i( |0 J; p, \; }4 ~* y) o6 X9 n 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic; s# l. R- P J+ ~6 T) @) u/ Y h means it is designed ' T/ v7 i( Y9 C0 E+ r; d j4 B- S5 Y- d' ]- S for vector and matrix operations. You can often speed up your M-file c 8 O9 g# V) w" A4 M6 e0 R$ ~ode by using- Z+ G. x7 Z0 n$ B8 _, V2 j vectorizing algorithms that take advantage of this design. Vectorizati# g3 k* T e$ ^, w" z on means converting1 H1 g$ S. ^. @9 {5 s" e& x1 | for and while loops to equivalent vector or matrix operations.”。改进 ' }( b! Y; `. X, T这样的状况有两种方法:- I1 j" e! t1 b! I. z: Y0 E 5 [ e1 V- X- O- `' T6 o2 p# g) n; n$ Sa、尽量用向量化的运算来代替循环操作。如将下面的程序:8 X5 U, b, F: z3 _! A& A 6 R7 q, Y3 N$ h; O6 Yi=0; 4 ]! [( w; k8 A0 |for t = 0:.01:101 v( N" [3 C8 J8 ` i = i+1; , G) U. g: Q$ q) Cy(i) = sin(t);3 `6 Y* @' Q: _/ {5 o end ' x5 g3 B. W9 B/ u替换为:, T4 g- D% h% W2 h' e- Z t = 0:.01:10; 4 X, h3 W% L) wy = sin(t);5 i3 J! C" Z: p3 f# E8 c; D 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i 4 z% H. x$ B a5 o- C3 h/ W xpermutepermute、 , T8 l3 l8 Q5 ^' Z" S% v8 H- ireshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums ( I/ g. C! U6 K fumind2sub、) k8 T' v( s' i3 u+ n$ } ndgridrepmat、sort、sum 等。 7 G( R/ A3 E/ e * ^7 n& v8 ?* _ g' T* M3 M请注意matlan文档中还有这样一句补充:“Before taking the time to 2 ~0 D9 J+ S$ A" r4 D- k* H' ~' ~ Q! M% T: w9 x0 `( ]- O vectorize your code, read the section on Performance Acceleration. ' O- q5 s4 G' ~, ?; M$ S4 b$ p/ pYou may be able to- {; o+ e) k2 Y% U speed up your program by just as much using the MATLAB JIT Accelera % [% {. q9 M+ ~& w9 c Gtor instead of " w$ j& ]7 M. D* V3 W! kvectorizing.”。何去何从,自己把握。# y9 |- B% z: M ; V& H1 Z I2 y3 t) K8 B- x, ? b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 # R" z* T: Y+ C: v6 i$ h行循环次数少的, 8 D! s/ ?. U& g4 Z3 @( k/ j内环执行循环次数多的。这样可以显著提高速度。 \4 ]. |: N' k7 s- S& {+ o5 P; r5 M8 l u. Z 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on 4 y/ u2 a# x9 n4 Q+ hescell、struct、 0 o; m" B8 E8 i1 `" srepmat等。 t" ]% i3 n: V: Q5 d b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:4 ?( f- @0 l4 O% E" l : A$ z- Z: z" A* Y& Y' s3 TA = int8(zeros(100)); 4 t/ q6 E [# A换成:4 x1 }/ z& h8 b4 Y A = repmat(int8(0), 100, 100);! a8 v+ {! o: o/ q+ T c、当需要扩充一个变量的大小、维数时使用repmat函数。 " M* x, @7 L. d7 I; J% W/ a 6 z. W9 C6 y e3 ?4 {% v2 [) f4 w3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 . V3 t9 ~2 s, q+ C3 n: Ub、使用Functions而不是Scripts 。 ' d1 m: c) S" |3 f7 o0 I% V- |$ U1 j : W1 \6 S/ b5 h) \ 三、 绝招4 h4 L% v$ [. w! } - x# n: M9 v4 `0 x; L* V( s你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。" K; ~' n9 e! s7 _- W7 F 1、改用更有效的算法 7 @, u$ X; t& r2 b9 D7 T* b2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。5 q* F" v4 W% T0 p& L( S 1 h1 H3 ~, C. H g" J+ V关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ 8 h5 e2 ~$ ~0 H, O语言文件,VC编译”。

) N" {& P' b% O i5 l; {

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

    / E2 U9 g" }/ M1 {! l

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

    回复

    使用道具 举报

    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-6-14 03:42 , Processed in 0.490746 second(s), 104 queries .

    回顶部