QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab0 T* L+ i5 m2 j8 j, t 标 题: 加速matlab运行的三重境界 9 T. V: D0 B( u/ {/ E5 g3 g发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) + F l* q+ d! D ?7 n' z! {, y! Y( w, l* Z. t5 y& i6 \ 加速matlab运行的三重境界

7 c) v) c8 u( P! q : Y" J1 v) o+ l! O' _

一、 遵守Performance Acceleration的规则; I1 |3 u; s4 t) O9 M* m$ D # N1 a- R2 {0 J- l. y# K* n+ V关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将, B" i* T4 F1 g6 J! Q/ W 其规则总结如下7条:9 u+ l3 Y* B6 N3 C 1、只有使用以下数据类型,matlab才会对其加速: 4 P$ c2 v6 B7 A: w3 [logical,char,int8,uint8,int16,uint16,int32,uint32,double7 w# ]: V: x3 H8 }7 d. C 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu 8 y) W5 u) [& z- X, R; @- P( J: M' ore,single, . C: P( W6 i6 d& V( K$ d- m3 {, V# k% ]- x function handle,java classes,user classes,int64,uint645 O: L& g( l- C 2、matlab不会对超过三维的数组进行加速。: d# _+ l0 G* @& S$ u! r2 z+ Z 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 , i1 t3 Q' p j. T4 ]1 p来表示;, M. e( ^0 e6 Y b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数4 _( v- a) I# }" b( {8 o 据类型,只使用" k7 m* F' Y7 a" j; K 三维以下的数组;c、循环内只调用了内建函数(build-in function)。7 i8 F2 C: j3 C9 q0 E% f" Y 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将1 ]7 K5 I9 |/ S! ` 加速运行。' C$ m6 d5 w+ _! l5 W 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: ! m2 I0 I1 }! H0 }3 A! Hx = a.name; for k=1:10000, sin(A(k)), end; 6 a' n0 e$ U% q% V' {9 N c. [7 d* u6 K6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速' E: H3 b- K' S( x2 y 度。 ( x# D( t+ L6 [3 x$ L0 ^7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 1 c/ p4 O. {+ {6 W% j运行速度。 . F) E/ V5 |3 I3 u, T8 B

7 t( \7 [$ \1 F6 M

二、 遵守三条规则 . i0 n' X7 n# b5 I0 P8 R ( @) w, m3 e- y- t& ^* j+ e1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic & f8 j& r% K: I# g" t2 ]h means it is designed 2 a9 `. @) q0 w' d/ w) g0 ?2 m, H# w u% F+ b# k for vector and matrix operations. You can often speed up your M-file c x8 B* X+ i/ h) w/ j; N9 P7 y ode by using, j, ?" P$ h4 V/ f$ v vectorizing algorithms that take advantage of this design. Vectorizati 3 p- M {) B7 u6 C9 |on means converting7 ?% g' a. l; D0 ]- t for and while loops to equivalent vector or matrix operations.”。改进 + u8 C9 ?6 e3 u4 [" @- b6 i1 \. C P这样的状况有两种方法: & r6 Z, ?/ A" ^! P( @$ t, P' D 8 P- a' C$ t3 e7 sa、尽量用向量化的运算来代替循环操作。如将下面的程序:1 A# N `& \- f u9 ?- S! ~ : C/ e/ s l3 B0 U. n i=0; ' {4 T5 a* u: Bfor t = 0:.01:106 F$ ]5 }9 C5 G- n2 K M6 X i = i+1; 9 w# o3 v& N. R- dy(i) = sin(t); $ L4 D& ?) D( y; C: {end ! I A2 _# T# h2 T0 I替换为:5 u7 Y) r7 K% B( Y6 m. y+ \ t = 0:.01:10; ! c2 w& H$ @' ^' V9 h& H7 Jy = sin(t);# Y% L: f! J8 a, z! t; R0 l 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i , D! Y: {2 K0 S5 P! F# D( P( y- u7 w% `permute、permute、 " d) K( F0 R) Vreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums* |& \. \. E* U; w$ ^ um、ind2sub、 2 K% L% V8 N0 ]: P5 Y& bndgrid、repmat、sort、sum 等。. N7 c( ?$ G0 [" W" c + u( |# C9 w* m& F6 ~. p: I 请注意matlan文档中还有这样一句补充:“Before taking the time to ) Z& b0 G* `6 B1 A. \+ x# M4 [, N8 X3 _; h vectorize your code, read the section on Performance Acceleration.! Z* l4 H$ G7 Y% U2 E1 ^ You may be able to + Q2 |. h+ `8 G( K5 p$ G0 Tspeed up your program by just as much using the MATLAB JIT Accelera! S6 p6 i: b4 p tor instead of: T$ f2 o$ K$ N+ f3 \& U vectorizing.”。何去何从,自己把握。$ |! {2 I) e t. |3 f! k1 Z& U 7 [ l. q$ ?" i# y7 U- U3 nb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 4 n; R6 L5 J) P% b行循环次数少的, 1 {/ O p9 n8 @0 q5 V内环执行循环次数多的。这样可以显著提高速度。( j, @/ ]4 _, p ^ ' p5 Z4 @) K0 v4 U 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on0 W1 [ g$ S3 j es、cell、struct、 9 u, j9 Q$ |( y+ [+ T# \5 `repmat等。& J9 `0 m+ S& T; J b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: " F& f: Q* ^5 g$ A9 ], A" R 5 S9 @! W. Y& RA = int8(zeros(100));2 m# w. D# @' n) ~; Q4 k3 l 换成: u, [( Q; |, `4 ^+ }) v% A4 o A = repmat(int8(0), 100, 100);. w0 ?4 ]2 I6 ^) k, z c、当需要扩充一个变量的大小、维数时使用repmat函数。* X! `, W g$ o0 p6 W# F1 ~! a / j+ l8 u H$ u: A2 a2 Y 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。; [& K) s4 w9 q, | b、使用Functions而不是Scripts 。$ }1 u% [% V- q' B5 a/ A

0 _! T5 j- Y4 `& U, s

三、 绝招 & e! ?2 R% x9 \) q: z9 U. Y: K4 B) A 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。+ V+ A1 r8 v; D+ [ 1、改用更有效的算法7 r5 W0 O. ?# x6 i 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 % s C( D: j; R: P9 S& w! ~ L: h! Q% Z" d2 S 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++# G/ R' Z) _7 }3 S) a9 C# ` 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

/ U! z1 D" ^3 f5 |* p; t* E

加速之前应该先测试; W% b! \6 ]' _: m! M2 _ 使用profiler可以获得程序各个部分的耗时 1 |8 _9 V% q' F$ Q如此就能高效的加速/ n# p3 t( ^# I3 q1 m) ~2 m

' V. j5 _6 R# {) E

因为有的时候导致速度变慢的原因是逻辑结构不合理,) I( g$ {: Y" m0 X j* [* ?- d% U 而不涉及程序技术

# P% q* J7 s) [' X

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

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 15:27 , Processed in 0.512743 second(s), 90 queries .

回顶部