QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

( ~# V$ f4 @% T1 D7 U4 B2 O9 |

CTerm下载文章: 紫丁香★+ v& s$ V: P+ j) m( h 7 Z5 h2 }$ R7 G" r: V- C, N6 q2 _ 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 7 ~% y2 D6 h/ M 题: 加速matlab运行的三重境界 ( ^( G" a- R0 L2 c w& u( Y+ \发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) % |! \4 B; ?* Q; g7 p$ C0 t 7 @' B+ J% g: H加速matlab运行的三重境界 3 n7 M, R4 v$ |. e4 N一、 遵守Performance Acceleration的规则% F8 o7 q/ w# l5 u; B2 h6 m2 V 二、 遵守三条规则 ' O, b# \* _! L* ^6 g/ ]三、 绝招

( S* k! `* X7 A+ h3 U0 Z

一、 遵守Performance Acceleration的规则) g7 k- q, v& j; p0 C. I# E 2 G8 R* [3 ~+ `关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将7 j1 I1 D: [4 t! r" { 其规则总结如下7条:. ?7 Y( e& N( l7 }3 d5 n% c6 z 1、只有使用以下数据类型,matlab才会对其加速: ! h4 M0 j J4 ~logical,char,int8,uint8,int16,uint16,int32,uint32,double ! m% `) P2 @8 H8 ]4 |' Z而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu) P* M5 z; _' S re,single,1 A: V: A' K% t/ E* J, _ - t/ _# k+ M! o; { function handle,java classes,user classes,int64,uint64 0 h) r- m+ k& q1 M2 U1 {2matlab不会对超过三维的数组进行加速。) T* Z8 t, m4 U" U* A' ~ 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值3 i6 w8 D3 `) b/ p 来表示; 3 i. N8 x3 ]! E7 M8 G6 Nbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 : S0 m' G; U8 ?* q1 U3 u& \据类型,只使用 . l) P5 _ t1 P: ^8 ?5 }& X三维以下的数组;c、循环内只调用了内建函数(build-in function)。& I" ]$ w. L3 }3 Y5 t# I) A& k 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 ' A. t, W A! f, `, v8 N0 q; r加速运行。 ! o4 b7 M6 X1 h9 I$ U5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:! Z k7 e- m$ |5 d, Z( i! X x = a.name; for k=1:10000, sin(A(k)), end;7 y. q& w/ C$ c4 n1 a4 U! q 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速3 j% N. ?3 i* l4 d7 Q 度。5 N0 {5 Z X& M( P 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低8 w& J' B. W2 {# _ 运行速度。 9 K7 S, z% N$ s. M# i% N/ N% v- b; u+ f) O5 I/ U% z % e k1 `7 D6 e: c" ~二、 遵守三条规则. B# D' v" Z5 W9 L! Z+ ]+ u O) E 7 o; M! @1 J3 @5 l( h% |+ ? 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 1 Y/ `: @1 {7 O, M1 b' W! xh means it is designed + y) R7 P, f" t: r0 b* T9 j$ C. W1 X# v* W6 e c for vector and matrix operations. You can often speed up your M-file c1 j2 T3 \" ^ v- S4 ^# `4 d8 u ode by using W3 H8 [' \1 w% [ vectorizing algorithms that take advantage of this design. Vectorizati ! g8 G' b+ K; \on means converting' l$ y" H, U7 a+ g8 W3 } for and while loops to equivalent vector or matrix operations.”。改进 ; K+ H& I, S' y {6 B$ X这样的状况有两种方法: 7 r6 M5 d$ ~# p5 }/ Z% @ p, r. y) e& |6 V a、尽量用向量化的运算来代替循环操作。如将下面的程序: 6 m4 R5 F, B$ y* |4 }6 a ( s! n- r% b( l- B7 `, T# Ti=0; O' ]' O( U L1 C: W- cfor t = 0:.01:10& ?4 s1 h% t# x2 g$ O, { i = i+1;' f" ~4 r/ ^3 d( R y(i) = sin(t);/ X, `7 G5 V, [ x$ E5 m+ ^0 F end3 i. d- g; @$ c0 \" ` 替换为: # @( E) @9 a. e* v5 B( M3 G8 `t = 0:.01:10;# W, { p1 k' m; Q y = sin(t); # M9 ?- R. ~2 h/ V$ \( f9 ^! I: T速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i( v& M1 _6 o- m2 z' Q2 b permutepermute、 3 ?7 f4 C$ }/ O5 T4 I0 T. preshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums; x/ K: L# Y- C( o% k umind2sub、* l6 D0 ]9 c8 [( Z ndgridrepmat、sort、sum 等。. l1 ?! S2 o& `1 D. R8 L/ r# F 5 |4 C- j& J3 g4 e( h3 [ 请注意matlan文档中还有这样一句补充:“Before taking the time to ?, ^7 B3 _% `/ ^; t# } e, N9 ?* K4 l vectorize your code, read the section on Performance Acceleration. & {4 S3 O/ g$ i% e/ m. k: QYou may be able to ; N" k4 W4 G X* s5 _# qspeed up your program by just as much using the MATLAB JIT Accelera 7 ?8 _6 n& Q' ttor instead of5 {7 j+ n4 x E% E% t vectorizing.”。何去何从,自己把握。- h! G; A& ~0 @ ; w6 k; |* @- o$ K9 m; Ub、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执9 c/ o n# F- {: Z" b 行循环次数少的, ! M" | a# m+ w6 `内环执行循环次数多的。这样可以显著提高速度。6 d9 j" U& _- t* @ 8 E* H, V$ I/ V; @+ @( w3 C2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on 9 ]: N7 }( `+ Aescell、struct、 , K k- M6 _' krepmat等。( w7 F# c5 f ] K; ]9 m& V b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:/ G9 E# z! H1 X0 A9 ~, Q! A o8 m! g, f8 _) A3 rA = int8(zeros(100)); ! O# B9 [; Z4 j# N5 y! [换成: 5 i8 O% a: G- n0 [& _/ n wA = repmat(int8(0), 100, 100); + H# ^& R# A( `c、当需要扩充一个变量的大小、维数时使用repmat函数。 * x2 k, ?- b& t; ^; X" l- C7 h6 |6 ?: P2 @$ ^: ]1 s j) g 3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 ' X! l# s' u' M, ob、使用Functions而不是Scripts 。7 f0 M4 L! W7 P9 H& v( q$ D * a# @5 S [- e; Q 8 w, P3 n$ s3 ~三、 绝招 ! Z3 C$ ?: O( e% ^6 A* O) B4 m1 u, X9 @ 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 $ a8 m: T9 o/ B* a% N/ i) Q6 u! y. V1、改用更有效的算法3 o7 v( I- a. K ?' _ 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。! r+ p+ j% ?: `; L& ]! N 0 T# {& O: q* C0 |. I$ r& ^' n关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ ! Q* c. A& @& S& `- D O3 I% W语言文件,VC编译”。

8 q5 U8 h% M* U8 `. G1 k6 U

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-5-26 15:47 , Processed in 0.550313 second(s), 103 queries .

    回顶部