QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

O" q- X6 x [( C* H4 w# Q& L

CTerm下载文章: 紫丁香★ , s0 t) N, z$ p. U7 P5 ?8 e/ \* W# @9 e9 g+ I7 h* S* b$ H$ _' W 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab3 Y, C3 h' W6 }7 X$ h+ N% o/ p 题: 加速matlab运行的三重境界 3 G( |. `: R7 a& h6 L/ E0 W# i发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)& r5 s% u' r/ b0 Q4 H. H F 8 X3 J5 y6 H) `3 K8 F加速matlab运行的三重境界 % V+ H8 e4 V+ I) p/ j- O一、 遵守Performance Acceleration的规则, h; o# \2 R0 U4 M 二、 遵守三条规则- b; w% _0 N2 e" h 三、 绝招

$ b, I9 r5 m+ c- ~9 U. Z

一、 遵守Performance Acceleration的规则 # W2 i( C8 k2 o& j Z6 e' U ; S3 b9 l9 ~) q: T7 E! Z; W% _关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 % H1 w* l( W; w3 B0 }+ W; T! c其规则总结如下7条:; e$ |. E6 J( V7 ] 1、只有使用以下数据类型,matlab才会对其加速: 6 Y8 V7 C/ m9 s- nlogical,char,int8,uint8,int16,uint16,int32,uint32,double " i0 ?+ K3 q& E: S% Y而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu0 J' ]9 A3 I0 i, p re,single," F5 {; q! H. M 5 \# Z' a# Z( X; efunction handle,java classes,user classes,int64,uint64 4 v; G' C% A/ g* _0 b2matlab不会对超过三维的数组进行加速。 3 H! V$ Z0 s* l; I! R L$ B3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值( n/ V( |6 S* N0 G+ V P 来表示;8 a, W/ E* q- K6 d9 D$ v% ?6 ` bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数, n. g, } \4 m4 E$ k" X+ n 据类型,只使用; ?# c W' n0 {' S! j 三维以下的数组;c、循环内只调用了内建函数(build-in function)。& ^: M% ~7 f# B 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将) Y' g- L. }$ }- F C4 h% A 加速运行。 - z( E' y" E: K! h5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: ; S5 V0 l) Z! j3 J; W* R- A$ bx = a.name; for k=1:10000, sin(A(k)), end;9 k1 V, w" x% J- w* w 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 & Y+ r( ^0 R T+ d( i, W7 a度。; v8 J8 u5 q) `6 W/ A- V5 z 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 1 N& T7 K' n. ^; ]+ s6 m8 }运行速度。 ' z$ ^+ T. y) H, |6 Q. N% a$ U2 P& l% @; j! L , l L7 T. b) U4 o& \! v0 K" {二、 遵守三条规则: i8 B( s& V% a- U ]& v( b8 ^2 v 0 b& d. W# ] c4 Q3 n @4 z2 d6 p1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic/ [6 e& _* c# ~* \" F) a h means it is designed + g2 n: {$ R- J% j1 r. W! n. Y; [/ d' c9 Z for vector and matrix operations. You can often speed up your M-file c 7 V$ o9 f5 u+ s( Code by using % M s( L+ \/ Svectorizing algorithms that take advantage of this design. Vectorizati % d, i5 z e# ]0 d9 v- i& V- mon means converting" Z% r- S' I- I for and while loops to equivalent vector or matrix operations.”。改进 4 ]9 I" Z( F p1 Y* K这样的状况有两种方法:% a; ] [+ Q3 c* B7 @! f1 N3 K / b1 e+ P7 f8 J3 U: Q; g5 K0 s1 @a、尽量用向量化的运算来代替循环操作。如将下面的程序:4 o" |- i0 S% L q! X( `% L+ H 6 l3 z; e& v3 h! V( v8 W- y i=0;) R3 i x6 E; Y( @- | for t = 0:.01:10 . F B8 i% J9 ?! C+ I2 yi = i+1;: y* W* m# M8 p4 ^ y(i) = sin(t);- g1 s9 t# l% A7 m# x$ \ end `5 Y; ~) r% E5 c* { 替换为: , f6 M/ `# b: z; }6 |! Yt = 0:.01:10; 0 z* q" a' _- S& m* {% my = sin(t);0 E1 Y* M# \1 z0 g( S 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i9 G) y, P0 _, z permutepermute、* S$ t" a( D$ e reshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums! l: T) L( A" P' M# J2 Q umind2sub、' n( M z( C) O8 l1 W$ P( O+ R ndgridrepmat、sort、sum 等。 : m+ P' y [( r7 ~0 N" f/ ^. [) y; O- t6 j& ` 请注意matlan文档中还有这样一句补充:“Before taking the time to * b! w, A& m# S) n5 g- _# D& s2 @0 M+ `: ~- T$ r vectorize your code, read the section on Performance Acceleration.; [! o( g$ E4 W& i You may be able to 5 |2 `- i7 L0 B2 M g! l5 N/ Tspeed up your program by just as much using the MATLAB JIT Accelera ) [' m: G6 T3 r" T; ctor instead of! d9 x/ H+ H( Z. }# k$ \) E vectorizing.”。何去何从,自己把握。) O; H, y# c$ F: }. J! H * A8 X( I# o7 D6 W" g b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执3 Y+ t l) l% U5 B& Y 行循环次数少的,; W) x |3 e$ G6 `8 u6 ~ 内环执行循环次数多的。这样可以显著提高速度。 & I( {, {: k! d1 p) V E" E' G6 m4 t2 B5 T4 r% F9 L- I 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on 8 t& [' x8 k( p& ~% y Yescell、struct、 ; n2 m0 {2 G) } orepmat等。2 i) e9 u& b% t' h8 D b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: / P3 O. n) @6 L5 `, Y5 s- O% u& ?3 N8 n9 P A = int8(zeros(100)); 3 A6 e# q" I, y8 D, I k' E, ]换成:0 I n2 j% L4 X% c A = repmat(int8(0), 100, 100); j; B: N) n9 q5 ?! B4 z% H; U c、当需要扩充一个变量的大小、维数时使用repmat函数。6 m) K/ U! f5 p% u/ x9 G J1 H8 C + f- O) k" w; ?' D5 `3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。) G2 \$ @! F: e! R b、使用Functions而不是Scripts 。- X! v P) R3 W 5 Z9 J8 U% Z1 t4 A+ v) T 1 [4 C% k r1 G; C; i% [/ ]: _ 三、 绝招 + r% S/ @. r( ^' [! _& t 1 h+ z' p7 }- P$ l你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 % Y3 J/ n! |5 r" b1 b( L1、改用更有效的算法/ X& U5 G D' Y4 W9 `! Q 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 5 f$ ]" \' n9 N( _: p 3 N/ C8 \1 a! t/ o关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ * x9 H& d, g9 v. A+ `语言文件,VC编译”。

! R$ l0 ^- Q$ m2 |

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

    . J$ M, `3 l. ?4 U* I, n0 y

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

    回复

    使用道具 举报

    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:48 , Processed in 0.762716 second(s), 103 queries .

    回顶部