QQ登录

只需要一步,快速开始

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

【转载】加速matlab运行的三个境界

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

1341

主题

738

听众

2万

积分

数学中国总编辑

  • TA的每日心情

    2016-11-18 10:46
  • 签到天数: 206 天

    [LV.7]常住居民III

    超级版主

    社区QQ达人 邮箱绑定达人 元老勋章 发帖功臣 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组2011年第一期数学建模

    群组第一期sas基础实训课堂

    群组第二届数模基础实训

    群组2012第二期MCM/ICM优秀

    群组MCM优秀论文解析专题

    跳转到指定楼层
    1#
    发表于 2010-1-25 22:39 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
    7 f! v  D4 Y3 O0 n; h
    - ?8 \1 H. ^; r  `: N加速matlab运行的三重境界

    加速matlab运行的三重境界" n0 |: c4 P0 z6 R7 q
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 j& j$ Z  `6 W3 P6 q. d
    %%%%%%%%%%%%%%%%%%%%%%%
    " Z/ a6 Q: S. j, k1 L2 A7 `1 l9 c
    一、 遵守Performance Acceleration的规则
    3 x  Q- O1 d6 j/ i' {3 a二、 遵守三条规则
    1 x6 ^7 G. c1 c. `6 e0 b9 Y* \三、 绝招& R1 k4 ~- \( P
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 R. b  d( v/ ^' i  L9 {- @
    %%%%%%%%%%%%%%%%%%%%%%%

    一、 遵守Performance Acceleration的规则4 E% h) z8 a/ i8 ?
    关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
    3 o' e" {' p, D. a( `, ?其规则总结如下7条:
    # \% x8 t5 l2 U' M1、只有使用以下数据类型,matlab才会对其加速:. C8 g7 ]. E: u; N2 O' Q& l/ V* s2 z
    logical,char,int8,uint8,int16,uint16,int32,uint32,double
    ( g! |: z% w$ Q
    而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
    ( O9 z/ `! Q$ jre,single,; m$ W/ s# k4 k
    function handle,java classes,user classes,int64,uint64/ s( i  v' r9 T4 @8 B
    2
    matlab不会对超过三维的数组进行加速。
    * N$ ]- s  s" v/ \% H+ ^/ i
    3、当使用for循环时,只有遵守以下规则才会被加速:afor循环的范围只用标量值
    . g* G% f5 q2 j  j0 o) U来表示;, ~; t- X: S, L& S2 @
    bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数% U2 F) o' c9 Y* R  H( C8 K  g
    据类型,只使用
    4 Q% A# i) T" q) c6 z三维以下的数组;c、循环内只调用了内建函数(build-in function)。
    # u1 _1 V0 [, t( q/ O3 M' z4、当使用ifelseifwhileswitch时,其条件测试语句中只使用了标量值时,将0 L$ \0 w! o& C# f; v6 {1 c) D+ `
    加速运行。
    + e! ^: y4 I+ `+ d* F! U5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:( m( C) f8 ^7 K, P6 x* X7 ~# `  H" k$ m
    x = a.name; for k=1:10000, sin(A(k)), end;
    ; ], e0 t& _8 A2 E3 c9 t. E; y6
    、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
    0 {7 X  y* k9 p/ S9 R度。# E6 D6 i* p4 w
    7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低: r. p2 f' u' w. `. @' x: \
    运行速度。
    : b: q1 S' r- o2 {6 E& n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    + T- ]- x! x0 X3 b: g( k%%%%%%%%%%%%%%%%%%%%%%%$ Z. Z3 [% N9 n$ Q5 T3 f7 X5 }
    二、 遵守三条规则
    " ~/ S0 F% ^6 F/ K' R1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
    ) X5 g: M2 |  D3 Oh means it is designed
    9 t3 @/ _7 w8 X) Wfor vector and matrix operations. You can often speed up your M-file c
    6 ^, Z; \5 g8 m# h+ `# C2 pode by using4 r2 H- p! W. z0 s) _; H
    vectorizing algorithms that take advantage of this design. Vectorizati
    ; p' ~2 x5 H3 i5 Q7 \7 jon means converting
    & `* M7 S; {, K/ @% Dfor and while loops to equivalent vector or matrix operations.”
    。改进
    1 i  e7 W$ A, r' j. {, H
    这样的状况有两种方法:7 Q: m2 d9 g5 O7 k) e! z: c
    a、尽量用向量化的运算来代替循环操作。如将下面的程序:
    ) C& _8 W: v: s. A$ \" j" }6 Ii=0;
    6 l+ W& j; E* W. n! Ufor t = 0:.01:103 Q. i- \9 z) e
    i = i+1;# ~( P+ f; ~1 O- m3 }; |( z. E/ |' i
    y(i) = sin(t);
    % X' m% S# Z7 V/ y8 pend( K9 ~, |- z# W6 N/ l& k6 t  {- z( B
    替换为:: t; h) a5 W7 A" Q0 w5 v
    t = 0:.01:10;
    * q  f; t+ g, iy = sin(t);
    7 W  e9 R4 z3 P7 b8 ]: H0 `3 w
    速度将会大大加快。最常用的使用vectorizing技术的函数有:Alldiffi' g0 w% Y& [- ]% {' v1 l. }/ V
    permute
    permute
    % j, o" [( j; w% M8 o4 \
    reshapesqueezeanyfindlogicalprodshiftdimsub2indcums: i2 j. s" H, {% E: r
    um
    ind2sub
    & W8 Q( c' L! ~9 ?: V3 t# W2 s
    ndgridrepmatsortsum 等。
    9 b' ]! S4 U* N* R6 ?请注意matlan文档中还有这样一句补充:“Before taking the time to; W9 {$ _+ m1 u! ?8 w% v9 ]
    vectorize your code, read the section on Performance Acceleration.
    # q$ T3 x) N8 `, P) PYou may be able to; ^- F) c4 {. f6 N: O
    speed up your program by just as much using the MATLAB JIT Accelera
    9 a4 i7 N4 y1 u, p9 a+ V+ `6 d2 ktor instead of
    8 g4 D) B8 k0 |0 Q% t! v9 h' j5 u3 N' xvectorizing.”
    。何去何从,自己把握。

    6 }  D' F- R( F" Y5 G7 ]' U. f( e, |b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执6 G8 b8 c' [* F- d$ m. }' ]
    行循环次数少的,
    ' R- r. }* C& X6 F0 l$ y内环执行循环次数多的。这样可以显著提高速度。
    8 V' ?& c- [# D. P6 j: H$ d2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeroson
    5 R8 O/ P6 j3 r* K6 I! bes
    cellstruct
    ' ^( q: b6 F! u6 x8 K
    repmat等。) H% B' ^. e; h0 V: K
    b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
    % w0 `/ z# c( W5 l* LA = int8(zeros(100));% G) i) X. S6 X2 ~! ]
    换成:
    5 ~, i% f+ G/ N  V3 }' F0 _& e9 w6 e6 YA = repmat(int8(0), 100, 100);
    * ?3 H8 j' }6 |5 _& zc
    、当需要扩充一个变量的大小、维数时使用repmat函数。# q7 u7 ?6 i9 v- p$ ^: W9 V
    3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
    8 |, n" l" l( I# b# W/ |# t# Qb、使用Functions而不是Scripts
    # S! m( ]5 D) Z7 E0 L0 S/ K%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# m0 B( _: |6 U
    %%%%%%%%%%%%%%%%%%%%%%%
    7 H) ]: v- E. r4 f. A
    三、 绝招) T% P0 D& k7 i4 u1 r, [  N' z5 I2 w
    你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。- \: e; j1 d, }4 z1 W  }& Y
    1、改用更有效的算法& _6 S: p$ p' A4 P; b! t
    2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。


    2 Q9 M( B$ L) j4 W
    2 W( X7 d( v/ t4 j  来源:iLoveMatlab! I6 _! F! ~9 u' i0 b  C) x2 S" t) P

    8 \% W7 g+ F- p- |  H  z! |5 \. U2 M7 _* }2 J
    在这里本人推荐使用‘绝招’。
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    XINGQIBIN 实名认证       

    0

    主题

    5

    听众

    94

    积分

    升级  93.68%

    该用户从未签到

    群组数模应用

    回复

    使用道具 举报

    HSinB 实名认证       

    0

    主题

    5

    听众

    1651

    积分

    升级  65.1%

  • TA的每日心情
    开心
    2012-2-9 17:19
  • 签到天数: 2 天

    [LV.1]初来乍到

    新人进步奖 发帖功臣

    回复

    使用道具 举报

    D-lin 实名认证       

    22

    主题

    5

    听众

    465

    积分

    升级  55%

    该用户从未签到

    自我介绍
    人称玉树临风胜潘安,一支梨花压海棠

    新人进步奖

    回复

    使用道具 举报

    leo12ok 实名认证       

    3

    主题

    4

    听众

    556

    积分

    升级  85.33%

  • TA的每日心情
    擦汗
    2012-6-14 16:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    自我介绍
    200 字节以内

    不支持自定义 Discuz! 代码

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    3

    听众

    95

    积分

    升级  94.74%

    该用户从未签到

    自我介绍
    嘿嘿~  可爱的我~
    回复

    使用道具 举报

    isnowfy 实名认证       

    6

    主题

    4

    听众

    473

    积分

    升级  57.67%

  • TA的每日心情
    开心
    2013-3-7 02:00
  • 签到天数: 1 天

    [LV.1]初来乍到

    自我介绍
    200 字节以内
    不支持自定义 Discuz! 代码

    新人进步奖 最具活力勋章 发帖功臣

    群组Matlab讨论组

    mark。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    回复

    使用道具 举报

    27

    主题

    4

    听众

    196

    积分

    升级  48%

    该用户从未签到

    收藏了~~~对现在建模很有用……我上次写的程序就运行了N久都没出结果……郁闷……
    回复

    使用道具 举报

    schnee        

    0

    主题

    4

    听众

    241

    积分

    升级  70.5%

  • TA的每日心情
    开心
    2013-9-3 12:40
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-10 11:05 , Processed in 0.372030 second(s), 100 queries .

    回顶部