QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

, @8 G, c5 z2 H4 B6 b0 D

CTerm下载文章: 紫丁香★3 T8 R5 ?+ l. q/ ^ 6 t2 R/ R; Z/ U9 ` 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab" z$ y! A( e0 [ 题: 加速matlab运行的三重境界$ p: m* e+ [' l$ y( r! w \ 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)$ M6 [2 c3 Y/ p7 Q, ^, e7 T ( F z0 \6 J: ]" w0 ]' ~/ N 加速matlab运行的三重境界: U+ `) x' T) _! t6 M& Y2 R1 h 一、 遵守Performance Acceleration的规则 6 p9 n& p2 \5 R8 {$ u) U4 ?. d" N# A二、 遵守三条规则 : W& y7 D( S" w9 E& u7 O. a三、 绝招

: H& u( W) m9 N# [! ~9 m$ c6 x

一、 遵守Performance Acceleration的规则 : r' M- O! @, U7 I 6 z! t1 G% i. ?" {3 \关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 5 N7 q' l" B5 M7 W5 m其规则总结如下7条: 1 i! d' f& l5 T0 N8 F0 j1、只有使用以下数据类型,matlab才会对其加速: * W1 Y Z2 Y' {! T1 Y2 p5 Ilogical,char,int8,uint8,int16,uint16,int32,uint32,double' [: {$ @& Z$ o( L; u; o 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu' h( A7 h. ?* b8 o! ]8 n% x re,single, & a4 {( P& a; B& E6 b* z! {( j+ d3 R! k( l! o8 a function handle,java classes,user classes,int64,uint64 * U2 {- e2 g5 d6 x$ V' T2matlab不会对超过三维的数组进行加速。 L6 }$ ^- D0 E3 |$ l* J3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值: G6 K; o! e! g2 j( ^, T+ t 来表示; , ^% ~% M; m: C9 Zbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数( m3 O6 X' H7 N& [, K& K 据类型,只使用" q/ @% b4 J- h' t7 ^ 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 ( ]% x7 D9 a! n# P4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 ! m" N; E9 n( ~9 o$ h( F3 m. }加速运行。/ R! _+ ]8 Z$ T1 s( T$ l1 G, G 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:8 E5 X8 b4 A( I0 G x = a.name; for k=1:10000, sin(A(k)), end; 9 D7 A* a G- i+ s8 A' {6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速" E2 v& `7 F" r 度。6 j# ]0 M3 q, D3 N2 Y: f# a9 u 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 : s: \ X, T' t% O4 t0 [+ T- B运行速度。, H, h* O- E3 s# w _ " t9 n" K, {9 V( E% z! M * W/ ~! P! k- T& Y- h 二、 遵守三条规则 # G* _3 v1 Q( R+ m' r* N ) B V* D! j1 C$ G2 y2 F1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic6 z; l) y( m( t( w* u; M9 t9 A h means it is designed, S/ w- h7 \' Q' M4 F; C : p: }* k- e8 N& W for vector and matrix operations. You can often speed up your M-file c: }' [1 I2 Q* E& m ode by using% X- X0 y( F9 D9 I) s* E9 r1 d vectorizing algorithms that take advantage of this design. Vectorizati4 o" j; a( X. x, u on means converting ' X: g1 }0 }# Hfor and while loops to equivalent vector or matrix operations.”。改进* s) I \% L6 Y2 a2 g 这样的状况有两种方法:+ O% I! U1 W* l! ^0 u h $ ^. O* ^) P1 c P& w+ ~9 ~, Q a、尽量用向量化的运算来代替循环操作。如将下面的程序:3 r* O5 |; B$ |2 p- Q * s3 m+ d e. G& [( a3 E* g1 e i=0;# W: G0 X% X5 M+ [, C4 M for t = 0:.01:10. `: G9 Y( t( c3 u i = i+1;' q$ _9 a* \9 t3 _5 o/ w/ C y(i) = sin(t); ?! W/ |& F. C" T. o end/ H- d1 F0 D' G/ O: G+ J, `8 c" Z7 t 替换为: , a& d) |! h8 n& gt = 0:.01:10;% Y! y+ T3 L2 E. A y = sin(t);0 H8 H O% h- \' }& J 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i # N4 U/ [: j1 t6 g( Hpermutepermute、 : E$ u& P2 K: x. ^0 M9 z q. h* O7 Rreshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums % m4 P4 z) d' v5 y, n7 wumind2sub、 * c% I$ I/ G3 Indgridrepmat、sort、sum 等。 4 _( C5 T K/ _ 0 Z, y' {1 K5 |" h6 I# B请注意matlan文档中还有这样一句补充:“Before taking the time to 0 c f9 g, q+ C1 S* A0 Q1 h( H9 J * w; o" X- a& A5 f+ I" V1 \+ kvectorize your code, read the section on Performance Acceleration.7 _; Q! R: j6 T" B You may be able to # I8 o2 `6 r% r! @/ Jspeed up your program by just as much using the MATLAB JIT Accelera # u7 a! f' O S% ]: b9 u; gtor instead of3 q+ M. V; t: y, z! G1 ~4 c8 Y vectorizing.”。何去何从,自己把握。 5 T( _5 v$ m- f2 h' M- E1 i( A, J9 p, i- t" Z b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执/ ?! g3 X+ _" l7 }: S7 E" j 行循环次数少的,8 }. \6 }7 K' j- \) | 内环执行循环次数多的。这样可以显著提高速度。% {" o+ x3 x( ], x @ 1 |2 L8 W7 y1 h; J1 q 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on ! Y a6 K, P t( O3 H7 } Jescell、struct、 j1 [5 R9 e2 d Brepmat等。 7 y A" s1 E7 j. Xb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 ~' `: M6 w" B 5 h! |/ Y. \) V A = int8(zeros(100)); ; l* D9 b7 O6 l6 v换成:# [: W# l7 Q/ g A = repmat(int8(0), 100, 100); % E K- j6 c# d3 Kc、当需要扩充一个变量的大小、维数时使用repmat函数。3 i+ \2 o; H! p3 r2 a5 ^6 t1 A! h7 i & y' k1 {0 z, t# K2 Z 3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。: l* @5 F( I' ]+ m b、使用Functions而不是Scripts 。2 ]! `! S3 x4 @! `. K+ ]! p 3 F/ z" r3 R. U" |6 L8 u : C& g* r/ m9 [/ }% [- w. E* w三、 绝招) I* g* Y. g4 ^) b1 z % d4 r# o+ F, ]9 S你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 Q; j6 S. @' C1、改用更有效的算法% q2 P& H0 p/ i+ z( T8 Y 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 P1 B0 p8 S9 H: K: q 5 S {, \5 y1 W1 a关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ ' Q ?% h2 H L; J B4 x& d- K语言文件,VC编译”。

1 J5 u0 v. ~/ t$ a8 g

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-17 06:56 , Processed in 0.498942 second(s), 104 queries .

    回顶部