QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

+ \1 z$ z7 X. y" d1 i: A/ V- B

CTerm下载文章: 紫丁香★6 L; o0 _& n- A$ b' L 6 C; {) M$ b$ @. h& B发信人: fork (撒哈拉沙漠的沙), 信区: Matlab , l1 v' d& p: U# [. J3 P 题: 加速matlab运行的三重境界 ' ^0 m! P* v& a( x- m发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 5 s6 l; W- n n/ {% u9 f- |1 p ( G8 p0 h2 v1 S加速matlab运行的三重境界 ; d) y, b8 @3 E9 p% \" R7 N7 `, Q一、 遵守Performance Acceleration的规则& }/ T$ r$ J1 j7 g I 二、 遵守三条规则$ i5 N4 `2 @+ Y9 F) z+ P 三、 绝招

" d% U: ?9 Z. L% H5 e' V

一、 遵守Performance Acceleration的规则 % l n3 z8 x6 i0 f ^" O% ? { # C. |6 W( E F8 \7 p4 o& s) a关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 9 Q6 B/ Y# M: P7 O( C其规则总结如下7条: - h+ M; g; n2 ~+ d9 {, F$ t1、只有使用以下数据类型,matlab才会对其加速:9 M' T; | k/ C2 C* z* }0 T P logical,char,int8,uint8,int16,uint16,int32,uint32,double- N& @9 A! v+ l* ] 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu8 A! q6 w- n u. x re,single, 7 c# Y, A) Q( G4 T 0 I* `) b- ~2 nfunction handle,java classes,user classes,int64,uint64 - q3 |) ?' P- O6 J2matlab不会对超过三维的数组进行加速。 % f& d& b7 y7 E; o7 }1 b3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 , l! y# A. g. d8 |# a8 d) r来表示;% c1 p- L. m) y M1 J( _7 ~ bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数: g d. |7 W9 A) B3 C; u5 c 据类型,只使用( U7 Q# K6 w H o/ h 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 7 g7 H1 I* }2 ?2 o4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将7 C& U L6 |/ t) V3 K 加速运行。 - a, {+ C. _0 W5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: $ T* a! z3 b1 j' _+ ox = a.name; for k=1:10000, sin(A(k)), end;" {( @; Y- W8 T" U 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速; f% l/ t9 X, D0 y' z 度。) s1 U$ Y! L9 i0 R: m! m2 G% G 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低# F8 {( ^ ?, e 运行速度。5 Y. H. g q5 t/ E# _# } P! g) b 7 U. k- K9 q* B4 S, c5 R T, v% I9 _ 二、 遵守三条规则 7 |0 n( z$ z$ R k. K' T7 @+ ]1 H; Q6 D* Z1 C* H% K1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic0 E \* B+ c9 A) K: j' y. T h means it is designed4 ^0 l7 B" {. J- }3 G9 m* Z 9 s4 X1 O2 e& ~" o9 V6 Xfor vector and matrix operations. You can often speed up your M-file c - @! w& |' x" ?9 t8 t4 A1 K! j, |- Node by using ) A- ], q! Y2 ], o* m0 ]. h" svectorizing algorithms that take advantage of this design. Vectorizati( [1 J- p4 n+ \) @3 o, } on means converting 1 O. n# d4 {9 Y, v6 F* l# cfor and while loops to equivalent vector or matrix operations.”。改进 - [+ g5 [; x: @! ^" G! N" ~这样的状况有两种方法: 9 O: g m, ]% ~1 |" n6 U3 ?0 D! b a、尽量用向量化的运算来代替循环操作。如将下面的程序:# \& I T+ O: u! P$ r0 ~ 9 S/ b4 [( S( F) Z8 c9 Q) c% P3 H i=0;6 D1 S& b/ ^4 o% ]1 q( L for t = 0:.01:10" w P' p2 j1 B/ O0 m i = i+1; 1 t% S4 i$ d V* y: n( gy(i) = sin(t);3 p- A5 `- c) b+ k. h end 3 M( X$ F) \. r+ ? T/ y" ?替换为: , b. u" d, d+ e. g9 |t = 0:.01:10;4 P8 _/ ?6 T2 Z H! \ y = sin(t);/ I, _: W3 S4 N, L) [ 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i% c; C7 Y6 U1 ?+ {7 X0 ] permutepermute、 * S' N% X. ]# |$ P" }- x# areshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums k# ^% \4 K2 N9 Q6 v5 ?umind2sub、 L+ k9 @" I- L) W3 h ndgridrepmat、sort、sum 等。 7 {! A( Y! @' ], E! K1 s& o8 S+ q+ Z ~9 ] 请注意matlan文档中还有这样一句补充:“Before taking the time to5 Z/ |, L$ G" |& T. w. T$ l 1 A3 B3 S9 _" O vectorize your code, read the section on Performance Acceleration. 7 Y0 j* ~5 u( s" I: WYou may be able to$ z2 p( o2 ~ {) Z1 i speed up your program by just as much using the MATLAB JIT Accelera A5 D. y, ^8 e3 `; Q2 qtor instead of1 m- R, R( T& s/ x; a/ _. Q/ A vectorizing.”。何去何从,自己把握。- u* H9 J* }* h. K $ |1 Y8 C! I' O# c+ v, E. z b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执- C% ^2 ^6 e9 R9 j5 ~4 I8 f 行循环次数少的, , L) o7 n. l' W: y5 U3 {0 g内环执行循环次数多的。这样可以显著提高速度。 4 i" `* w9 ]' Q3 @3 c+ i* K& |* S1 \- [ 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on8 Z+ Z, w; O# a4 u2 W' ?! h: K( D escell、struct、5 u" o8 N$ K: U: a& o& P! p4 Z repmat等。 6 J% l" B! a y1 Xb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:& k+ t. s9 K" W+ H8 s; m: K" @ ' H/ l2 q- T7 o A = int8(zeros(100)); 5 v- x+ [3 W' c, O换成:/ U7 l% S8 n. `* x; H A = repmat(int8(0), 100, 100);9 G: Q! S1 k+ f c、当需要扩充一个变量的大小、维数时使用repmat函数。2 d% z6 N: B( \& l: |7 L0 I $ I, Y$ j s- @/ Y 3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 ( a3 _3 C" q; X9 Wb、使用Functions而不是Scripts 。 , p C i7 P( b2 Z7 s; c$ u4 a$ Q; f& ]; } $ `2 ^/ R. y1 U8 J* H9 |三、 绝招 q9 A" C4 Y4 k # l' |; @3 D0 i& r' [5 A0 U你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。! ~5 S. l! O8 R) H8 R0 A 1、改用更有效的算法 : b! [1 O8 i) K3 m/ I1 w2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。: A% ^* f, ?4 \6 K 4 B7 u, Y- w% X8 S) \8 R关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ 4 ^ v; A0 |; z! ]; Z) H语言文件,VC编译”。

- X1 d" A$ A8 V Z' [

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

    ; C# A! o& B! \6 {* v

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

    回复

    使用道具 举报

    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-9-12 14:52 , Processed in 1.074029 second(s), 104 queries .

    回顶部