QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4368|回复: 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 编辑
    : R) w1 }- V! W- g# n! R" C4 K4 Y5 V1 W3 A# |% M
    加速matlab运行的三重境界

    加速matlab运行的三重境界% V$ B! W+ I( c! K& c3 F  u
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    4 _+ I% o: V+ @  a; L3 G%%%%%%%%%%%%%%%%%%%%%%%
    5 Q! e: z% J2 E- _( ]$ u, S* H; H
    一、 遵守Performance Acceleration的规则5 P2 W  k: |3 }- j, [! t
    二、 遵守三条规则
    ( [% e% C7 d; x# T4 h, B/ g6 s三、 绝招
    4 i) s$ H3 N) D$ M2 f7 v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% G) G: a; y" \2 Q
    %%%%%%%%%%%%%%%%%%%%%%%

    一、 遵守Performance Acceleration的规则4 I0 o% _$ x" v; E; q6 i
    关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将; U& ~) e1 ^' d" k
    其规则总结如下7条:
    : N4 H: e$ R: L1、只有使用以下数据类型,matlab才会对其加速:
    : l! z. m2 o/ [logical,char,int8,uint8,int16,uint16,int32,uint32,double
      f' h8 L! o2 O0 x8 i
    而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu7 U/ D2 `6 d1 j/ y  N' c8 R
    re,single,
    ! a5 e+ {% V5 X6 Y; [# E% Mfunction handle,java classes,user classes,int64,uint64" L6 z. k" f  M- T: ]/ ?
    2
    matlab不会对超过三维的数组进行加速。

    # [( M6 c( i# V8 j/ Z" M- v5 v3、当使用for循环时,只有遵守以下规则才会被加速:afor循环的范围只用标量值; O$ u0 T. {+ B! c, e& J# V9 e
    来表示;
    # K( z5 D% w3 G% m& w. ~) t) Vbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数' |- f, o% z* l) f4 n. ^
    据类型,只使用
    ) I/ S% W5 E; W" A' Y% ?三维以下的数组;c、循环内只调用了内建函数(build-in function)。
    4 ?0 M+ L; M* J- u% ~! s4、当使用ifelseifwhileswitch时,其条件测试语句中只使用了标量值时,将
    & D- t1 n+ s% d$ b" l1 W加速运行。$ X1 z& P4 Y& b; R) B2 A2 i+ b
    5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:9 c1 ^9 g0 |/ O) R1 ~. S
    x = a.name; for k=1:10000, sin(A(k)), end;
    , D' W7 ~* {; p6
    、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速' s1 K" D5 G' R1 f) m8 i( d
    度。! b0 {( f! S4 \( C
    7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
    $ Q: D' _2 g9 a8 R9 o0 {运行速度。
    , j1 [5 Q" o$ D%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%( U( y6 B8 t0 l& j  A( l
    %%%%%%%%%%%%%%%%%%%%%%%$ ?/ u+ s7 V& z1 O: Y1 Z; T2 p
    二、 遵守三条规则
    - h$ W8 S; S5 E: m1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
    * A) j( v8 L* x9 U  yh means it is designed* K% ^- n% L# X1 ?" J
    for vector and matrix operations. You can often speed up your M-file c
    . h# L8 x2 ^- `* u) u4 Mode by using
    9 J$ r( M* {$ s1 Dvectorizing algorithms that take advantage of this design. Vectorizati+ p+ @& l5 z4 g; K7 X( Q
    on means converting
    2 d5 f/ x- D5 w8 Qfor and while loops to equivalent vector or matrix operations.”
    。改进

    . a9 d. c/ @# D# h这样的状况有两种方法:
      t2 ?  i" B7 l! S! G, W2 Ca、尽量用向量化的运算来代替循环操作。如将下面的程序:% [2 s3 v0 H3 o/ G  m
    i=0;0 T* `" v* g- e& @, z$ o
    for t = 0:.01:10* d& X; _2 `! Q  t7 A6 y) l
    i = i+1;
    : ^' S0 I6 E  t  [4 c+ Vy(i) = sin(t);6 G4 B7 {9 M& Q
    end
    " ~1 j2 w+ u: K$ d( j
    替换为:1 Y  p' {1 d' |" o$ D
    t = 0:.01:10;  R& W! s7 v+ u5 j( r- p
    y = sin(t);
    # n) ~& _! {( Z* E- U5 F
    速度将会大大加快。最常用的使用vectorizing技术的函数有:Alldiffi
    1 e8 }% I$ i& f$ w, @. epermute
    permute
    ( z1 W* _9 t. R- ^
    reshapesqueezeanyfindlogicalprodshiftdimsub2indcums4 S: P  }) c+ Q
    um
    ind2sub

    1 z  F0 b% `1 C$ v& ^5 Z7 Dndgridrepmatsortsum 等。( E) L! F# x* R0 I5 O5 R% L) S/ Z
    请注意matlan文档中还有这样一句补充:“Before taking the time to: g: L) o1 Z, a, o) K& O3 q+ p
    vectorize your code, read the section on Performance Acceleration.
    / S7 _2 D6 d/ D; p" a" @You may be able to
    + f6 Y, r1 g3 f. vspeed up your program by just as much using the MATLAB JIT Accelera6 M% c8 ]4 G5 k
    tor instead of, i  M+ X* C0 M) D" b9 U+ Z3 C+ _
    vectorizing.”
    。何去何从,自己把握。
    1 P& W. V, C6 }: c& D' R2 i1 P) u# J+ F
    b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
    6 D8 Z" [8 ]' M4 R$ J. Y7 b行循环次数少的,) L+ q$ B% Y: A+ O! B
    内环执行循环次数多的。这样可以显著提高速度。
    3 k( z5 _5 L8 R/ U$ r2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeroson+ J. c" e% P3 [! T9 w( U
    es
    cellstruct
    . B+ w7 J% ?7 `- A1 s/ P, r' V
    repmat等。: \! z' s) N% d# o* M
    b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:& z" V. s4 e! U, T- @# j4 H/ F
    A = int8(zeros(100));0 U- f0 b! d$ Q' I
    换成:
    ' H0 u6 \# f2 Q, SA = repmat(int8(0), 100, 100);
    " _9 ^8 h* q" Nc
    、当需要扩充一个变量的大小、维数时使用repmat函数。
    5 F+ k: M" D; m' T3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
    # X) d) n& z: _7 l5 xb、使用Functions而不是Scripts . I( v! _* N6 g$ P% E! B; ~
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ! C; N  o  v4 t& c%%%%%%%%%%%%%%%%%%%%%%%
    9 i, ]4 @. y2 v" a! L5 |
    三、 绝招4 x; d6 X+ L+ }- |3 s: a$ Y
    你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。1 N4 D2 z" Z4 I3 P2 B0 W; N9 P' y
    1、改用更有效的算法
    , I- {6 N6 V. h2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。

    3 R$ |# R0 ^9 n4 z% K# t
    2 C% j) X0 \) |
      来源:iLoveMatlab
    ( s1 ^0 p9 F, Z' F
    " c; Y) ?: D4 B9 m7 B
    ) K/ f, D& f, ]% `在这里本人推荐使用‘绝招’。
    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, 2025-9-17 11:55 , Processed in 0.629697 second(s), 99 queries .

    回顶部