QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

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

( b! H, O( n- O# G( h x) Q N0 a

CTerm下载文章: 紫丁香★ - A7 t7 r+ o0 _- v- E. n: C' f. B8 S Q5 ~ 发信人: fork (撒哈拉沙漠的沙), 信区: Matlab : n1 C9 R6 z: h$ u3 D 题: 加速matlab运行的三重境界8 Y- `" U% J, J2 d 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)4 Q1 ?1 e. U. ^/ A3 |! t + M- K, g( j* C6 F) P2 O: \ 加速matlab运行的三重境界 h, q/ t- r) K6 x) ~4 `/ y一、 遵守Performance Acceleration的规则 ( |! _4 K) J0 T& D2 A二、 遵守三条规则 , O- R* F' \' ?, `$ _) A4 g三、 绝招

! f7 p$ y6 J+ p+ C7 a3 ]

一、 遵守Performance Acceleration的规则; H% `. A1 z! C& W9 ? ! K5 E$ b& u2 G! ]0 @ 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 ! C5 O. F$ Z& ^6 U+ j; \其规则总结如下7条: & P% A7 z; I" A1、只有使用以下数据类型,matlab才会对其加速:8 ~& A) Q0 e, @; f( K logical,char,int8,uint8,int16,uint16,int32,uint32,double ) Y, w0 b0 j6 [8 [/ v而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu 1 `7 Z: }# h5 w3 i- t' B- pre,single,; @$ x1 i; \- R3 @ ~5 W; o: f d2 wfunction handle,java classes,user classes,int64,uint64* n7 _2 C% x7 R7 o [2 N. c( l 2matlab不会对超过三维的数组进行加速。2 c3 A9 |* w# ~# N. v/ C 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 & {% {* r$ a% a- U# P来表示;" Z& W" X, J6 t0 G bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 0 E. I6 X' \8 \: Q; i4 m据类型,只使用 : v6 V& l$ p. Q& _9 ?三维以下的数组;c、循环内只调用了内建函数(build-in function)。1 @$ Y0 `8 z3 V/ v+ W4 C 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将) q8 ~" q/ M2 A, H5 R 加速运行。 5 s) H& L+ d! S7 R. n3 f5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: 1 s' ^6 _& l/ ]- x( V# E+ Lx = a.name; for k=1:10000, sin(A(k)), end;, O' I3 _# o. M, W* q0 ^8 c9 N 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速$ E' \1 z8 s v( |5 D. w 度。! e$ {7 Y; L" u, V 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 . U4 b8 f/ Q+ D' ~+ F5 b运行速度。" |8 s: \! O( B7 s , J. I2 ]' h" n6 {/ Y2 } # r0 f; X/ e. }# y! y二、 遵守三条规则 8 I1 L" V, _% K + D, t4 A2 E: d' J9 P2 N1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic9 q+ S, \" ~. [; Q) C6 T" v) C4 s h means it is designed! q' g) P. d- ^% ^+ Q ( k4 ~; u) M% U. @- Ffor vector and matrix operations. You can often speed up your M-file c6 o: a+ A1 o! G5 R% v3 v5 i ode by using& G; O. B7 H: U6 q vectorizing algorithms that take advantage of this design. Vectorizati 1 V& T3 O6 K& a8 L$ }# l# Eon means converting/ ?( C3 h+ G! v% j5 W& a6 z8 m for and while loops to equivalent vector or matrix operations.”。改进6 K! C! z) |3 f# p/ | 这样的状况有两种方法:; _8 _" F/ e' F) ]: J 7 e4 e2 B0 X' h1 `: ua、尽量用向量化的运算来代替循环操作。如将下面的程序:- ^1 Q, u( v! |9 W% P , D, L' y W' M: `" x+ Hi=0;2 h0 n% I- ?4 S( s for t = 0:.01:10 7 q* k, X. ^6 g3 wi = i+1; * ]. B; K$ J+ q& Ky(i) = sin(t); 3 N$ `9 H% i# g) q5 g; g$ Zend# z" D# c1 z7 _% u3 _$ B; u: ^ 替换为: # e+ }7 @9 t5 l7 {& ?2 It = 0:.01:10;2 U9 {4 U2 H" R7 f% |8 P y = sin(t); : X4 l. B$ ?! p/ x, K, B' n速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i0 H9 d& h( e9 V" K permutepermute、+ W* l V; y$ w3 C" N reshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums5 C8 B0 o" Q5 G& z umind2sub、 . J3 ]/ d$ Z8 n# H( ]/ H( {& mndgridrepmat、sort、sum 等。 , C! |( l# ]3 |+ v, o6 z& }7 G& f' S6 ^, _+ k2 J 请注意matlan文档中还有这样一句补充:“Before taking the time to, ?1 w# V! v; [& \% @! a ( \3 U; N0 s8 F1 _9 q0 ?$ evectorize your code, read the section on Performance Acceleration.. } B4 j8 C" v) j' t9 o* F; v& N You may be able to) Z) A# N6 N G3 D speed up your program by just as much using the MATLAB JIT Accelera7 n7 d# j7 T2 B tor instead of 8 B' W% B5 |7 `: bvectorizing.”。何去何从,自己把握。 # J, {+ b5 B$ Y; ^& J' P p/ ?, J5 A: L( ?% S. a8 Y& }* A Q b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执- W2 ^9 {' P* D 行循环次数少的, 5 ?. M; ?# x& @$ S内环执行循环次数多的。这样可以显著提高速度。 ! h Y# I7 w! y; u+ l6 z, c0 ?! z0 N0 J- j' c$ W E! }8 |: } 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on 5 a5 j2 H2 C1 p; o( y/ Wescell、struct、 ! I7 X) U3 n4 {6 g1 K+ q: lrepmat等。6 k& S1 a6 U2 p- M8 H b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: e% U# e- t" u , L! ]. b' d) p0 u' QA = int8(zeros(100));. S$ T- T; N, i& p 换成:2 h2 i8 x0 l$ T0 U A = repmat(int8(0), 100, 100);# R9 N0 m' i& O- }! s( l+ P" h3 f c、当需要扩充一个变量的大小、维数时使用repmat函数。 ) }# J2 M8 n, Q3 F3 n/ i & H) d5 I1 c) ]9 i4 Q% }+ B3 g$ k3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 3 y8 A/ }; X& P. n" P; n$ K7 h7 Cb、使用Functions而不是Scripts 。 # G' X9 R! D, [* W3 e2 E0 {7 d) G8 N5 }" ^9 B2 z+ W 3 k8 b" B2 m+ `2 Y三、 绝招1 v. Z9 M3 J5 s, [, k. |0 S. U* Q Q: F7 C# T$ y% i0 E 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 2 y: j2 Z# C/ p( k8 Y1、改用更有效的算法 8 T# y9 E" }1 a& W C& _2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 3 h+ P2 d5 a9 @# f9 I# J/ U: Z4 Q 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++! c6 T+ G' J8 b 语言文件,VC编译”。

7 a8 U/ ^% F+ t( \+ ?/ h6 |

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
一颗沙里看出一个世界 一朵野花里有一座天堂 把无限放在你的手掌上 永恒在一刹那里收藏 --英国诗人布莱克《天真的预示》
elinor        

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

echo5183        

0

主题

3

听众

24

积分

升级  20%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzm        

0

主题

2

听众

28

积分

升级  24.21%

该用户从未签到

新人进步奖

回复

使用道具 举报

1

主题

2

听众

114

积分

升级  7%

该用户从未签到

回复

使用道具 举报

yirongshu        

0

主题

2

听众

182

积分

升级  41%

该用户从未签到

回复

使用道具 举报

txj66        

2

主题

2

听众

42

积分

升级  38.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

ethuo        

1

主题

2

听众

84

积分

升级  83.16%

该用户从未签到

新人进步奖

MATLAB编程是不是很慢阿??

8 b; O1 t1 \: _7 w1 Z8 k

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

回复

使用道具 举报

ghc_lwd        

0

主题

2

听众

46

积分

升级  43.16%

该用户从未签到

新人进步奖

回复

使用道具 举报

damutou        

3

主题

2

听众

592

积分

  • TA的每日心情
    难过
    2014-5-5 19:58
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    群组学术交流A

    群组学术交流B

    群组A题

    群组B题

    群组C题

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-14 02:11 , Processed in 0.401052 second(s), 107 queries .

    回顶部