QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

9 U/ L. P% m1 W7 d. Y

CTerm下载文章: 紫丁香★ , a, _8 c. a6 ]) m: P, o3 ~ J/ x, s4 x: w, f$ m) D( g发信人: fork (撒哈拉沙漠的沙), 信区: Matlab4 r& _5 m3 L% m+ `3 f 题: 加速matlab运行的三重境界 " r: S4 q- p. F9 \- P% i发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 8 E2 I! r- V% L! u! E$ b; U- e |6 {0 o$ Q$ D 加速matlab运行的三重境界 % T( p0 L* H# R' P! ~; O一、 遵守Performance Acceleration的规则 " S, k# V. O5 `* n8 z. c$ k0 V二、 遵守三条规则4 q% W& Y( n9 m P: S4 S6 V 三、 绝招

6 p" @8 Y; L8 {& A1 {* ^

一、 遵守Performance Acceleration的规则 9 U0 H/ j% B- {! J m# l/ f/ u0 D 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 7 W \6 I: O" x/ K0 g7 Z其规则总结如下7条:# n9 C6 V: x6 Y) g3 k 1、只有使用以下数据类型,matlab才会对其加速:' P8 [+ T5 }, Z9 g logical,char,int8,uint8,int16,uint16,int32,uint32,double # @% G# `' [" B# u" q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu- ~# c5 u, q0 [, {+ {0 i# \) h re,single, . ]! N$ P4 J o' u- x% w8 e. r1 x5 K' O" }8 p, X function handle,java classes,user classes,int64,uint64 3 x3 ?9 p2 i5 v9 X& d2matlab不会对超过三维的数组进行加速。5 q& L+ H* P) Q! U& K& Q. b4 }3 ` 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值* l# Q0 }+ Q4 v2 f; D 来表示; $ X& }7 w* Q" v2 p* mbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 9 P4 r! G# G: h( |据类型,只使用9 C6 @# f7 Y" p% o" @! } 三维以下的数组;c、循环内只调用了内建函数(build-in function)。: X2 o5 s a: g2 i8 ~% q 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将8 C0 a9 O/ w5 }) g 加速运行。 % _3 p/ i. n$ }) p( @5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: : R# F) P( [( c0 O" M, Bx = a.name; for k=1:10000, sin(A(k)), end;- J+ p9 b4 y; J2 n" q2 X 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 `9 @/ O/ E/ @4 |% Z1 Y& G7 Y+ E度。0 {3 |; g. n! F, |5 e 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低3 l# Y; [6 Q" V3 H4 c, d 运行速度。2 L$ a0 J5 S' h ! J0 K7 M% j2 G; `6 g6 e 0 g# H* w6 P5 D v) g# E/ N二、 遵守三条规则 % v# b, `# z: i. @! J ' A. \0 F7 E! S. k* x* Y1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic8 D: H1 i% | Q( A h means it is designed - z. s" v2 {- R' | W # C$ v6 \0 i" k( I* `" C2 O' l# mfor vector and matrix operations. You can often speed up your M-file c 9 d- T+ x. L& I7 O# l! V6 c- L' o7 a7 Kode by using 1 h' k. Y; S& H' W& kvectorizing algorithms that take advantage of this design. Vectorizati* P- d3 c4 x' `- b- i$ F4 K: X m on means converting" G. I; Q5 Z2 `: C8 L for and while loops to equivalent vector or matrix operations.”。改进/ y; l3 ^; ]0 n6 {* x8 U7 Q 这样的状况有两种方法: : L0 r5 G; U% _) n" A6 ?" j$ U6 f2 @' _* t9 b a、尽量用向量化的运算来代替循环操作。如将下面的程序: + M( e" Y! ~' k5 K7 z8 Q% r& k c4 L2 m* T$ I& ^/ `/ ]" d i=0;6 E1 K9 A0 [5 q* T( k for t = 0:.01:10 5 I* l5 M1 n% v! d4 Si = i+1; f+ k6 G/ [( p3 O/ ^/ h2 x" R y(i) = sin(t); . O0 r! V& W6 tend 6 \, _! E) R/ I+ M" E4 {; }8 L O6 I替换为: 0 K& E6 c; h. W) G! ^$ P B1 Lt = 0:.01:10; ! e1 D: F" M' T: h6 H9 ~y = sin(t); 6 V* o% U/ O- e- S# G! c速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i3 J0 u9 U" _- o/ b3 v _ permutepermute、 + @+ _: t* W/ M) ~& ^6 Breshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums: a: H/ M5 ]2 n1 H umind2sub、4 @7 |- ~9 p0 n& m/ ~7 Y( A' l ndgridrepmat、sort、sum 等。9 M) H4 ~5 I7 }8 n* i 3 v, u* c+ M1 S; k1 | 请注意matlan文档中还有这样一句补充:“Before taking the time to) Q7 b5 `/ O6 G: m, x ( a) a" P. ]8 v/ Y$ Z% M7 uvectorize your code, read the section on Performance Acceleration.2 t8 Q; M9 f4 j9 M- w, ~ You may be able to. U7 O& F, t& `* L speed up your program by just as much using the MATLAB JIT Accelera ! H3 ^& R4 \, H' Q% m: x- H; @tor instead of * _6 S( F' L# a( f4 tvectorizing.”。何去何从,自己把握。6 l6 M; M1 R( Q; B2 U( V/ E. K' }/ b 1 x9 Y+ u* E9 b- T7 p9 B9 Qb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执' U( L% ^( L! n ? 行循环次数少的, 0 M9 E1 L0 h: C9 \5 @内环执行循环次数多的。这样可以显著提高速度。1 n) h% G& z8 N h' U3 i" \ * d: r3 g7 g' v0 K2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on 4 f# z7 w$ L! l) Gescell、struct、9 q5 q5 t& `% Q repmat等。 / M" Q# W* ~3 Y' n% \( l& pb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: & K- H/ S6 J! E7 Q4 r& [( s# ?" P* w& ^1 P4 [( O A = int8(zeros(100));6 [0 a4 N* Q* T# u, \/ T f 换成:5 M7 J, R5 c" c5 R+ s$ M/ b A = repmat(int8(0), 100, 100);0 {$ j8 L- h# x; D; Y c、当需要扩充一个变量的大小、维数时使用repmat函数。% Q- `9 @ @7 l# a& Q 3 Y6 X2 l2 C4 z3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 # G Z" s8 L7 P5 L& Yb、使用Functions而不是Scripts 。1 b* |( H3 I$ h8 H) H# G- j 2 }9 T) X3 C9 ~5 s! K( { h/ {7 h- a% p' e, S H三、 绝招0 e6 J: K1 ^' H/ Q' Z! I5 ^ : R/ ] R& P! a5 Q! U* p4 t你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。: q* O) [/ c$ \( n% i& k 1、改用更有效的算法! A, Z; P4 D+ w) k6 {4 E6 E 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 ; A$ s/ j6 v: f # z3 @2 c( D3 f( Y# I/ Y+ X关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ * M2 E1 X: l" j* A语言文件,VC编译”。

' x, L& N3 [# U# I4 Y

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编程是不是很慢阿??

    $ u, J% ?1 O8 D. ?1 ]2 j

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

    回复

    使用道具 举报

    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-7-30 22:08 , Processed in 0.593345 second(s), 104 queries .

    回顶部