QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

4 J& l, K; Z3 s9 R2 Z

CTerm下载文章: 紫丁香★ r5 y5 q* [$ M5 O1 i" T2 D* [8 @' K$ I7 S 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab4 ]: v3 z' l* Z" x4 {6 T3 c 题: 加速matlab运行的三重境界6 a/ h S9 F; A1 B+ w 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)2 n7 E4 _+ r- U1 U5 Y# z& j 8 d- M- G# X# w# P5 p: I加速matlab运行的三重境界2 O9 }. r0 ~" U+ \1 I9 u7 F% X 一、 遵守Performance Acceleration的规则 6 r' j6 i3 o" s) T二、 遵守三条规则& G) @( x. ~6 I' d2 {- a3 S 三、 绝招

1 d3 C& \9 t6 S' @

一、 遵守Performance Acceleration的规则* |8 g% y) K) ^5 m" G : v# V* }) n2 ~/ \2 R3 H: V关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 " F) {# K" m* M% `! ?2 L5 z9 i3 i其规则总结如下7条:9 k5 u3 D2 d* B F 1、只有使用以下数据类型,matlab才会对其加速:& Q0 G4 D+ k3 F7 q logical,char,int8,uint8,int16,uint16,int32,uint32,double4 }1 \; ?' d+ @, f+ r 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu $ u8 f5 T2 p1 f. p; Cre,single,& w5 m/ `; Q: W8 t7 X % A# v! R# W. p function handle,java classes,user classes,int64,uint64- y5 j/ w. A6 r+ I; y; f" f 2matlab不会对超过三维的数组进行加速。- R. x9 i# q$ Y$ | 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值2 p2 D) U. e1 A v; h% ^ 来表示; ( m2 x: |/ f+ U3 ebfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数& x, G ^4 ]$ \# _& D5 g 据类型,只使用 f5 h% c8 I, Z" [& Q( W% v$ b三维以下的数组;c、循环内只调用了内建函数(build-in function)。4 u% R* C/ z1 `6 J3 E 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将. y, e. ^+ N4 g8 M* h 加速运行。 ( f5 ^9 w6 v" v& D& C8 h i5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:& F1 h6 K f/ ]( z$ x" x x = a.name; for k=1:10000, sin(A(k)), end; * A5 |- `' t5 K; g6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速# X$ Z+ W' c- }. H' A3 k 度。/ u6 x* x+ l$ ?: v4 F, f 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 2 L0 W- T& ]! \# Z0 I7 i运行速度。 ( h) | s: O8 Y8 c/ Y! g6 f) u6 b; w8 ? 6 ^- Z5 X- y! u% z2 u9 a, m 二、 遵守三条规则 , Z4 \$ f Y* P* v7 t: C + B% e; E p; J" w1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic v7 u& D% S4 x3 d0 y8 rh means it is designed $ k7 P) [" q; Y. E9 O7 C2 g2 m/ u) Q$ A5 |4 w e for vector and matrix operations. You can often speed up your M-file c- z8 K; a0 t- R8 { ode by using 6 g" W+ q, t: X, q8 u ]vectorizing algorithms that take advantage of this design. Vectorizati3 V1 {5 ]+ |5 F( G9 A6 G- J on means converting9 J0 u2 B: P. W for and while loops to equivalent vector or matrix operations.”。改进 ! v3 e w; R" w7 x这样的状况有两种方法:- I! F8 V M0 o- s2 U! R $ ]2 v# ]( I' g9 D/ [2 v a、尽量用向量化的运算来代替循环操作。如将下面的程序:! e5 s( |* R! v6 g( C: W % h+ u R8 Q4 r* X/ l5 Yi=0;" F3 b. h5 F9 `6 b& N- E( a for t = 0:.01:10' i+ w( ^) @* n2 @ i = i+1; 2 ?* {" u* D& C7 K8 H yy(i) = sin(t); / t- |2 c; n! M$ i9 h4 dend & N2 q \9 L+ d$ F. Z: I9 H9 r% Y替换为: ! g9 p; G: |7 u, E% g) F& _; {% Q4 mt = 0:.01:10;; i# }# Q0 O+ q- @+ s S y = sin(t); & z. g P/ ~) m/ t1 e速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i 2 I* E6 d$ ~% r4 w8 A4 mpermutepermute、 6 f# @$ J B u+ [( z: Oreshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums * g2 V" D2 A. O; D8 D5 U- _umind2sub、 # y7 X! t% O d' B* O. m7 d, ^ndgridrepmat、sort、sum 等。 $ w5 F' b$ E1 j 1 W! k T% H; t( ^4 b请注意matlan文档中还有这样一句补充:“Before taking the time to ( {+ J3 _( x' W5 A; V# J. X & q8 T5 |, ^/ A9 _# [- W) zvectorize your code, read the section on Performance Acceleration. ! r: j: E+ p7 U" @- _You may be able to, U8 E0 M8 ~- r8 x6 W* h* u speed up your program by just as much using the MATLAB JIT Accelera. q5 V8 y# {" T) R& M. O- R tor instead of7 D+ O- k4 T0 V# E L vectorizing.”。何去何从,自己把握。 % F! D$ {# ?3 c8 M. o8 ] z# J$ H. a7 e9 a' E b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 3 e8 u# H! [5 c3 V: Z行循环次数少的,2 t4 @1 a) c0 q8 ?! ^ 内环执行循环次数多的。这样可以显著提高速度。$ I$ J5 c6 u/ i# F3 n0 H! k . z9 q7 }4 Q1 b3 ]) p" ?/ H2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on b& U+ g" P* {# ]3 H) @" \8 Xescell、struct、 ( f- K9 l& w: G% l; X a7 }8 O9 [repmat等。 ' v, l$ M- W4 Q3 p1 gb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 R' V9 Y3 L/ |4 ?! k. y$ q: Z$ G& }! b $ ^' d- T0 A) w" d7 O, P1 K7 LA = int8(zeros(100));! ^" b4 t" p- r 换成:) X' {9 I: K% @ A = repmat(int8(0), 100, 100);" R. i' [/ ~1 w c、当需要扩充一个变量的大小、维数时使用repmat函数。 . ~% a0 @ a6 ~ i7 W 4 f; M: j' c/ w) ?* }* X3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 $ \3 J Q' p+ e1 D: u; ?b、使用Functions而不是Scripts 。 ; D6 L/ j+ p9 C2 x* e" w9 Z0 ~ B* I: Z# r" s% e; @7 ]$ r. o" C% h* w( K+ N 三、 绝招0 c% n2 {1 _1 c 6 m/ L0 l! V$ n4 u! b( O2 @2 V9 S你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。! Q2 F4 W1 C! S+ W( d$ s4 @* X 1、改用更有效的算法 $ k+ _/ M; R: F4 c2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 ]; X) o* v$ c: Y/ h0 h7 M0 x6 v/ M' y 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++6 p$ D. p1 q& l0 f* i 语言文件,VC编译”。

! d9 K% Z5 ~# p) z7 G5 K

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%

    该用户从未签到

    新人进步奖

    MATLAB编程是不是很慢阿??

    2 z/ v0 M" a! j2 h+ g

    比不上现在的那些高级程序语言啊?

    回复

    使用道具 举报

    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-13 01:47 , Processed in 1.560874 second(s), 104 queries .

    回顶部