QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

% V) l4 \6 g" c0 I) N

CTerm下载文章: 紫丁香★6 I$ s; K0 _2 R" z9 m5 U0 c$ l 8 }. v6 h. y r5 Z2 m, O发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 9 b6 j. y$ l% e: [ 题: 加速matlab运行的三重境界6 K) _. \+ V% w& I+ Z1 i/ c 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)0 A y1 f4 y; O5 Z, x: g 3 ?2 f7 |% A8 u/ C- Y$ g加速matlab运行的三重境界2 G/ D* i ?3 _/ }9 h) s- d* k 一、 遵守Performance Acceleration的规则 % ?5 P; }) j" |# V6 {9 @8 [二、 遵守三条规则 + ^3 m& ~8 e/ _) C: e三、 绝招

. z( X2 W; p" \$ `. H3 l$ c

一、 遵守Performance Acceleration的规则6 x; f. q5 ^0 M" e% Q' ~ ) C0 Q8 q9 Q0 b( \4 u, f$ Q关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将" s0 a% E7 f. W1 J- o3 f5 G: I 其规则总结如下7条: ( M9 j& z: L7 [2 |# S$ r1、只有使用以下数据类型,matlab才会对其加速: 0 E. ~; W8 m1 w& { k C3 N# h. ~logical,char,int8,uint8,int16,uint16,int32,uint32,double / [* P7 M5 i4 s* q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu $ l6 |/ Q" s+ d$ n: Pre,single," y2 C1 z. y% _7 d8 z 9 P$ M9 s* r& }1 g5 S; G' F6 afunction handle,java classes,user classes,int64,uint64 , f0 M% u+ ? `3 a6 b; Q0 G+ o9 p2 G2matlab不会对超过三维的数组进行加速。( U, a& M# w1 k! T+ d 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值( X6 D3 A# r) k 来表示; ' b. X' K1 R+ \! c: }, Mbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 & h6 l" x; ?8 E+ e. ?/ g# V1 D据类型,只使用 # q5 {: C' ~2 W三维以下的数组;c、循环内只调用了内建函数(build-in function)。 6 `; _! E) u( S0 l7 }1 t/ s+ c4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 9 _4 B6 I3 J% N% ^# R$ D9 N, F加速运行。+ a- ]6 F0 ~5 k$ {$ X5 \( S 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:8 `, E3 e( A7 ]" H% A W x = a.name; for k=1:10000, sin(A(k)), end; : a/ O6 ]! p# E ^* C, K4 k X2 d" _6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 4 z- b! u2 ^" W- X3 t度。 ' R& X$ u2 l/ R7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 / j, D2 L& H! C5 D1 M运行速度。0 R H1 t7 q9 R7 T' c0 {# Q 2 ?' ~& L3 [( U: [ & \. J6 o& v8 u& }+ U6 Y 二、 遵守三条规则2 |, z9 v' S. J5 A' X" l, m 0 N' l: T8 u3 h5 c" U7 V" t1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic) T% {9 T! F8 m h means it is designed. K/ X+ K( Y5 J4 z + S D' l \/ k1 afor vector and matrix operations. You can often speed up your M-file c! J" T' u4 U8 G- W/ ^4 b ode by using0 I9 p+ f) ^0 ^0 P2 ~& P vectorizing algorithms that take advantage of this design. Vectorizati+ j" D- ^- Q, @7 g2 v0 p% ^ on means converting, C5 l3 M4 o. F( O: O( l/ @ for and while loops to equivalent vector or matrix operations.”。改进# S. A7 v) |+ d) j 这样的状况有两种方法: # W6 C/ ?0 @2 @( _, [' V6 u$ u3 I( J( E, Y, W v6 O7 L a、尽量用向量化的运算来代替循环操作。如将下面的程序:) W7 K8 O* A d4 g$ T 3 `# s& s! F/ M+ V0 Z! A7 li=0;0 z$ K4 r5 ]/ p0 ?6 O( U+ W9 W6 E for t = 0:.01:10 * ~: [7 F1 @& I$ F! _i = i+1;9 F, y2 A- g$ y+ j" Y y(i) = sin(t); - x, I. G3 t. _6 vend" q& d4 Y! W# r# n# f" k* \1 w' L 替换为: : o' d( @& C! i0 S4 F1 bt = 0:.01:10;* q2 }( {" Y5 E" ? y = sin(t);4 x5 }5 G: o8 P+ p; M, _ 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i! [1 O8 u/ Y0 ~" t" d* I permutepermute、 0 U' l% i' a6 C; t# n6 ireshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums7 Z p% \. c) H% r: Z g umind2sub、 8 u6 o" T$ \* a' Z; r% R& endgridrepmat、sort、sum 等。4 ?( I& s( u2 d! {! W8 A- O " o( s5 F# z2 Q6 @请注意matlan文档中还有这样一句补充:“Before taking the time to . H+ D$ y( x5 M% ^/ \/ w5 W- B! @( l& l9 H n vectorize your code, read the section on Performance Acceleration. 2 o+ t5 Q5 Q Y5 f% q; K9 H- lYou may be able to" f* I* Q" w. u I0 e3 j speed up your program by just as much using the MATLAB JIT Accelera 4 u4 I) ?; P; Htor instead of" F1 X2 L; `( u- o8 f vectorizing.”。何去何从,自己把握。, M- _* {/ l0 F 1 J# I8 S4 u6 N# Z# jb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执/ P; l' K- q. H8 v 行循环次数少的,3 G2 D! {2 v3 Z W' R1 U6 c 内环执行循环次数多的。这样可以显著提高速度。+ V4 U+ t* ^1 C7 } 0 J3 g# r: | s- C. I9 Y- A. Q2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on 1 G/ H8 w* m% j# P$ kescell、struct、* v# s- I6 ~% ?2 O& ? repmat等。 " P- _& u+ b+ tb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:( A0 M; ]4 a1 m+ h9 Q/ i ) u1 n0 L) W+ K2 w0 F A = int8(zeros(100));9 m& b( U, L' B3 ^' Y. R 换成:2 N& O5 l( O: m# J7 W7 A* @9 ] A = repmat(int8(0), 100, 100);1 b" A& B n- O" T6 V" j$ `: g" Z c、当需要扩充一个变量的大小、维数时使用repmat函数。; B7 u- B, W! d& l! R+ c$ S 5 `' g. z H8 @1 l 3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。7 N& p3 Z0 k) D J b、使用Functions而不是Scripts 。, ?+ |0 r0 {, o! d# V 9 z1 i% P$ u' O5 K! g: `# N! u8 d/ Q3 b/ e 三、 绝招 9 T9 U9 Y+ i) {. I* B1 o1 a " g% B* \6 E% x) O" p你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 7 S. U) y J- e# ], T1、改用更有效的算法6 P, }) j( {+ t0 y 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。" g2 d- \# w# Q& f A V 5 U8 g. f" s w$ O8 o 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ 1 ~8 B8 R+ R9 @% b语言文件,VC编译”。

( L, `7 S& q' I) u+ d( M4 B# 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%

    该用户从未签到

    新人进步奖

    MATLAB编程是不是很慢阿??

    . T$ S4 M, ^" k! H& o% C/ b+ n

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

    回复

    使用道具 举报

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

    回顶部