QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

跳转到指定楼层
1#
发表于 2004-12-21 11:00 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 2 X9 t4 o5 u2 c' G标 题: 加速matlab运行的三重境界 ; m# Z. U1 C- a- ^发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) s9 Y+ {9 Q" n$ @ 3 x: B* d! ^6 B6 Q+ F/ n6 j+ H加速matlab运行的三重境界

1 l2 V" J4 R) ^3 [3 ?' P : M! C: }4 s8 b3 @

一、 遵守Performance Acceleration的规则6 `$ b$ F: D8 T% [* D+ h9 y, O ; f9 B/ `' |& C' v Y关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 2 a V2 |0 s* Z7 ~9 a) b9 g. @6 t6 P其规则总结如下7条: " \( l6 ~ H$ s: L. o1、只有使用以下数据类型,matlab才会对其加速:0 ` M- T/ _8 m& x logical,char,int8,uint8,int16,uint16,int32,uint32,double3 Q6 z8 {) r, v2 h% c# k 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu / Y; m/ |4 y" D& K: @) wre,single,* B$ Q% m U$ h7 t( U' l. x6 w 1 s( [) ~0 I1 ~# u7 f' M% R1 Pfunction handle,java classes,user classes,int64,uint64 # D6 ?$ u4 B. `& B) h u8 x/ T: s8 F2、matlab不会对超过三维的数组进行加速。& l5 o9 ? X' w1 C 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值3 {7 z0 V {. \ 来表示; & k- B( [. m/ Hb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数" ^) a7 `/ A$ x 据类型,只使用 , @: e7 s% i9 ?1 `三维以下的数组;c、循环内只调用了内建函数(build-in function)。 8 H7 j# C& M6 n4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将7 m- a# \/ _0 d/ F y 加速运行。2 n6 J1 P" e/ ^/ m' S1 X; E7 Q# U& b 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: - Y; w6 O1 F! } ^9 Fx = a.name; for k=1:10000, sin(A(k)), end; " D4 R5 O( b5 b* V% O6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 4 `, S* i- _3 D( m6 K: F度。 - c, e d/ m2 o: \% m5 ?7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 % \. m- r( A3 D4 Y运行速度。 9 x! C) I$ B! e: K+ a' \* b- f

0 W( a- W; n% p) x s

二、 遵守三条规则 ( U% S$ a- d: u" R7 E1 r9 L5 @! u& W2 K7 x, f8 M2 h: w& C/ ? 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic : L9 I5 n+ W, X+ Fh means it is designed , ?7 t5 l+ p) P & [" w' q' ^0 T1 D2 o \* [! b2 Y( Lfor vector and matrix operations. You can often speed up your M-file c 3 }) h8 u- n" oode by using * _( T$ D7 r0 |. Mvectorizing algorithms that take advantage of this design. Vectorizati* }; M4 q0 D7 E- g/ d on means converting. K, Y5 V, }3 {) x8 \! ` for and while loops to equivalent vector or matrix operations.”。改进; w5 [$ a Z$ a( M3 W" e, A( V 这样的状况有两种方法: J1 a1 F8 F( g& Q. Y+ E& J, [ q4 Z3 n8 p a、尽量用向量化的运算来代替循环操作。如将下面的程序: : R g" n) F# I. v4 ?: {( l o. e: z+ j9 d! l7 m i=0; : E/ p6 e6 i/ c) ~5 ?4 nfor t = 0:.01:100 w/ O* K a/ P# a8 ^5 N# _$ l( v$ [ i = i+1;/ Z( U/ q* M2 O7 A9 ~ y(i) = sin(t); ! ^" v: c; m2 P6 [end( v" u% d* b: S3 [" }# ?3 d3 D; h 替换为: 1 S; Y* x. Q$ K2 x& y. gt = 0:.01:10; $ e" T+ Q* t) z$ hy = sin(t); & w5 C7 W8 [4 U速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i2 B0 b% u3 q6 v8 a$ x permute、permute、 7 p: u% c% c5 a* K, ?. V8 C' X% B2 [reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums 1 [- z1 |* Y3 x3 t& c mum、ind2sub、 6 l$ h3 J4 J# h; Z2 |. Y- \ndgrid、repmat、sort、sum 等。 / `0 a6 E$ Y3 J8 F- o8 b7 H! F6 i* }3 N4 ^, B9 [ 请注意matlan文档中还有这样一句补充:“Before taking the time to! J4 u( u6 {& O4 L 0 Q: [2 Q p, w& {vectorize your code, read the section on Performance Acceleration. 4 s( I# L! o$ S6 V3 f, K# U C/ f2 lYou may be able to % \0 j8 @$ V2 uspeed up your program by just as much using the MATLAB JIT Accelera , H& i' ]/ c2 | G1 E- L9 Vtor instead of 8 P1 Y1 A- H3 Vvectorizing.”。何去何从,自己把握。6 f# F! S+ {5 x2 S* @ | 5 z6 w& G9 K% i0 Ub、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 2 G8 M' V1 m, g8 F行循环次数少的,: c. B0 d F6 U7 `( Y9 I 内环执行循环次数多的。这样可以显著提高速度。# ]- C8 J i# u7 b: O- i1 X: `: F0 c ( x" c0 {6 K& X1 V2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on* s( N' j6 v3 u5 v1 ^- { es、cell、struct、 # Z* J2 C: u! [$ \/ b& Brepmat等。& ], A% y0 W" L* ~/ J0 v; | b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: 6 I5 f8 }0 c; w5 b+ O# ~ T 4 R3 s$ c2 P, r3 X7 ?A = int8(zeros(100));& A: @, i8 u! M2 Z 换成:5 }, j8 ^3 U: Y. R0 Z) [$ a A = repmat(int8(0), 100, 100); # R" K8 X9 E/ {, j4 dc、当需要扩充一个变量的大小、维数时使用repmat函数。1 K H# S- y/ g: H) b3 y8 n* g % j! N+ G) r9 f; p y6 r, i 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。" `* I3 ?6 B1 ]2 R0 M$ D b、使用Functions而不是Scripts 。: \' N5 ]1 y+ h

8 d7 `) b( B4 q4 f) w2 ?, c

三、 绝招 1 z( |7 l/ s k6 L. l# K$ i ! T+ J. E% A5 T- y7 H( e$ T你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 . X! f& s3 R6 N1、改用更有效的算法 ; | ~( y" s8 I* m2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 # G+ }8 B" F6 h( o X5 m 6 v+ N$ _) `% l关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ $ G1 H E: E' H5 u4 y0 u语言文件,VC编译”。

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

fup        

0

主题

2

听众

43

积分

升级  40%

该用户从未签到

新人进步奖

回复

使用道具 举报

ornewuser        

0

主题

2

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

注意

* t" _: z4 ~/ ~* D

加速之前应该先测试3 T7 F: [5 R6 m/ `1 F 使用profiler可以获得程序各个部分的耗时 : Z# \' D+ }3 S h6 ?如此就能高效的加速 x! [1 u- | z1 O7 G

7 `+ S- A4 ~4 D$ p

因为有的时候导致速度变慢的原因是逻辑结构不合理, 9 w; R7 U" s. W Z1 j而不涉及程序技术

4 i$ D/ j! f) E

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

布赖        

4

主题

2

听众

134

积分

升级  17%

该用户从未签到

回复

使用道具 举报

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

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

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

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

蒙公网安备 15010502000194号

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

GMT+8, 2026-5-26 05:58 , Processed in 1.329625 second(s), 91 queries .

回顶部