QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4505|回复: 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 编辑
    % T7 W6 `: e7 I
    0 m/ M" Q9 S' U) D; I; t( S加速matlab运行的三重境界

    加速matlab运行的三重境界
    1 O) P& \1 I, r! l6 y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 O, j  x9 Q8 U( s
    %%%%%%%%%%%%%%%%%%%%%%%
    ) w' a1 M5 X% P7 q; R  z2 u4 Q4 v
    一、 遵守Performance Acceleration的规则- C* {  s- r3 O, n: R6 ?8 R/ [) f
    二、 遵守三条规则2 g1 a* j% h; [" N- `4 a& }
    三、 绝招
    * D1 ~$ q! c9 A; p6 N2 S%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    6 x) u3 |# ^% F8 O%%%%%%%%%%%%%%%%%%%%%%%

    一、 遵守Performance Acceleration的规则0 }5 g0 d) a  S/ s) z! v/ C
    关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将+ z/ u  C2 C2 F! F5 s+ O3 _  {# |8 z
    其规则总结如下7条:
    ; K# }% H( C, w1、只有使用以下数据类型,matlab才会对其加速:
    # ]2 R" ?: r% c9 j! z' a- p  n7 _/ ~logical,char,int8,uint8,int16,uint16,int32,uint32,double! p' F/ ?! Z. p8 K" |
    而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu* `) i. O; j2 ~& B" y
    re,single,9 B* @* Y4 O1 i7 i" z% W3 I. L
    function handle,java classes,user classes,int64,uint64
    * L9 ]! h4 j0 @" n" Q2
    matlab不会对超过三维的数组进行加速。
    " L( s- U, P) c% t; Q6 n  x1 q
    3、当使用for循环时,只有遵守以下规则才会被加速:afor循环的范围只用标量值
    2 A. ^0 J7 o. a来表示;
    4 F, s) e3 s& G0 x7 l( Ubfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数8 L6 P4 l& B& J4 M" t3 c' `
    据类型,只使用
    6 e0 |; f) t5 p: `' [7 E: r三维以下的数组;c、循环内只调用了内建函数(build-in function)。
    . O  v9 A2 q, L8 Q2 v4、当使用ifelseifwhileswitch时,其条件测试语句中只使用了标量值时,将
    1 V+ U3 M1 k' i8 b' H8 a加速运行。
    ' }6 V& Z: e$ S0 H* ^1 T* T5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:0 T1 |0 k0 @  V
    x = a.name; for k=1:10000, sin(A(k)), end;$ s( G% I& |8 ^7 a# N" v3 T: n
    6
    、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速0 i: x/ F6 ~4 V- o
    度。
    , Q4 L( ^1 u. A( g7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低9 L  p8 ]) D- w0 K0 Q/ j  {7 ^: ~
    运行速度。: o1 y8 H# h7 S; x- M4 {
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' v, E/ ~* ?* s. m0 H8 h7 X
    %%%%%%%%%%%%%%%%%%%%%%%
    ; X. ~# X6 Q" J. h
    二、 遵守三条规则
    $ h, V- E2 v( [. c1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
    " b- R& s; b* ch means it is designed. I7 w9 @" {; a/ n$ k# _
    for vector and matrix operations. You can often speed up your M-file c
    ! Z3 O+ |) h1 v" w- \1 y; {ode by using
    ! w7 F: H: F; ^8 L# E* O: ~; [vectorizing algorithms that take advantage of this design. Vectorizati
    . b3 _3 G0 t5 W6 A2 O* Q4 ron means converting2 G3 z& R; O* |3 s
    for and while loops to equivalent vector or matrix operations.”
    。改进

    1 g& r+ {* V7 b3 |$ O) m+ l这样的状况有两种方法:
    ) H3 @/ N4 v. }1 {  M  e- \6 aa、尽量用向量化的运算来代替循环操作。如将下面的程序:6 D6 U/ D# N% R1 h9 x; R) O: V
    i=0;; w* `( Q) v1 ]: C) ^6 x0 f
    for t = 0:.01:10
    0 E( B4 i. _4 Q# M3 a; A/ vi = i+1;
    . @8 P/ g0 ?! d$ f% _y(i) = sin(t);, h5 z8 G/ k3 P: Z3 x
    end" v9 V% Z: x* {$ W2 E; `9 I
    替换为:  L: Y# V! m0 w7 t/ ^
    t = 0:.01:10;: V3 s* [, H1 P9 D0 B8 I1 l
    y = sin(t);
    ! _6 H6 D. C. r7 j0 T2 f
    速度将会大大加快。最常用的使用vectorizing技术的函数有:Alldiffi
    " g* P' j0 R) Q  D: d% npermute
    permute
    ( V0 m# f9 w: q$ v
    reshapesqueezeanyfindlogicalprodshiftdimsub2indcums
    / P9 B$ c6 Q& k- _) T+ T2 Z. Uum
    ind2sub
    2 \$ W4 G: q% ?& S1 }, ]; i6 E7 z
    ndgridrepmatsortsum 等。2 b7 s, m+ d: E# ?( {" B1 }
    请注意matlan文档中还有这样一句补充:“Before taking the time to+ I7 [0 Y* H% R4 b4 T' O* ^
    vectorize your code, read the section on Performance Acceleration.
    4 ^! ~, p: D8 o" H+ r+ A9 P8 bYou may be able to
    ; J! |9 u9 C/ b- @speed up your program by just as much using the MATLAB JIT Accelera
    * i. ?$ [, b6 U% j3 d4 R  Ntor instead of
    5 p# I4 s; G; F! q9 c- h% Uvectorizing.”
    。何去何从,自己把握。
    . z) ?! Y" K) f( K
    b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执$ [8 B% T' I3 H
    行循环次数少的,+ D. L; Z" ?7 Z+ G% m) ~* {/ ?+ |
    内环执行循环次数多的。这样可以显著提高速度。
    ) J; W: d% L# F# h2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeroson
    3 P: ~( \5 t! @+ O8 O' q1 tes
    cellstruct

    ( U8 R: X7 j' x/ O; Orepmat等。
    7 w! q; {* w$ K. L9 `5 ub、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:* ]( F5 O. ^) Z( ^) l
    A = int8(zeros(100));
    5 z( H; V; p1 x; N- ]4 V5 K' |
    换成:. _# L( C5 p# @: C
    A = repmat(int8(0), 100, 100);
    " Z( Z; C6 M0 S$ A3 p: ~. \c
    、当需要扩充一个变量的大小、维数时使用repmat函数。
    / G( Q* K: Y; y, d3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。$ v; B5 O( G8 _
    b、使用Functions而不是Scripts
    1 D- B4 M" R1 U# U, ^8 B1 ]9 L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 B9 E' C2 x- z2 Q" ]- C3 J
    %%%%%%%%%%%%%%%%%%%%%%%
    ! y1 `1 `+ E) V2 {
    三、 绝招
    % x& Z% c  |% L$ f; U1 s) e你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
    # B; r7 G- b4 ?5 F& E* [1、改用更有效的算法
    2 d% z! ]! W/ w  G3 i0 K2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。


    ) {, L$ ]) x- _6 Z8 k# s+ H- _7 ^( [+ l: C  j. M
      来源:iLoveMatlab
    ) w4 v: f1 H  n& ?! M( A* x! X  x5 w9 s! ^) Z# n" l, h7 L! C

    ( A# B9 ~" r0 O6 }; q6 w0 J在这里本人推荐使用‘绝招’。
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    schnee        

    0

    主题

    4

    听众

    241

    积分

    升级  70.5%

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

    [LV.4]偶尔看看III

    回复

    使用道具 举报

    27

    主题

    4

    听众

    196

    积分

    升级  48%

    该用户从未签到

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

    使用道具 举报

    isnowfy 实名认证       

    6

    主题

    4

    听众

    473

    积分

    升级  57.67%

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

    [LV.1]初来乍到

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

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

    群组Matlab讨论组

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

    使用道具 举报

    0

    主题

    3

    听众

    95

    积分

    升级  94.74%

    该用户从未签到

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

    使用道具 举报

    leo12ok 实名认证       

    3

    主题

    4

    听众

    556

    积分

    升级  85.33%

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

    [LV.1]初来乍到

    自我介绍
    200 字节以内

    不支持自定义 Discuz! 代码

    新人进步奖

    回复

    使用道具 举报

    D-lin 实名认证       

    22

    主题

    5

    听众

    465

    积分

    升级  55%

    该用户从未签到

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

    新人进步奖

    回复

    使用道具 举报

    HSinB 实名认证       

    0

    主题

    5

    听众

    1651

    积分

    升级  65.1%

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

    [LV.1]初来乍到

    新人进步奖 发帖功臣

    回复

    使用道具 举报

    XINGQIBIN 实名认证       

    0

    主题

    5

    听众

    94

    积分

    升级  93.68%

    该用户从未签到

    群组数模应用

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-10 04:37 , Processed in 0.821737 second(s), 100 queries .

    回顶部