QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 5 ]! a5 _" M* D; U4 X; q标 题: 加速matlab运行的三重境界/ r2 N6 @" d! j" a( ^7 c7 N 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004): X. W- B6 p7 l- Q7 ]6 Y ( u% P$ o3 b1 z加速matlab运行的三重境界

- w M& \" l1 g$ K' D 4 h# m, {$ H. C* b8 X2 c

一、 遵守Performance Acceleration的规则 + I* d5 ` r8 Z: A1 j- z. W m9 g( } ) \) F0 d5 p- ^% \; Z" m关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将$ l0 K4 h. _0 J9 R- q 其规则总结如下7条: ; i0 _& {3 C9 V' w1、只有使用以下数据类型,matlab才会对其加速: , F+ c! r2 f& P2 j Ilogical,char,int8,uint8,int16,uint16,int32,uint32,double% L( F0 H0 W* O& \4 l 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu# H/ ^$ ]- ^0 n: M' _ re,single, 2 s/ T! J, o$ V4 c: T X: H( R7 R+ ~function handle,java classes,user classes,int64,uint64: b$ i, h: V+ T" B 2、matlab不会对超过三维的数组进行加速。/ F, k5 o, _" O$ w 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 # \8 F* J: G, Z' y. i+ i" ?来表示; ; @. I6 L" s7 X, S& K, r! ]$ z8 M' K5 Lb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数8 d4 A' ^0 \# b A& ~ 据类型,只使用 ) |* O( N1 ?$ m$ p% G三维以下的数组;c、循环内只调用了内建函数(build-in function)。+ M% H0 q/ V0 l 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 . u; g$ L, Z6 p+ _加速运行。: t: G; f9 l ?( g 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:7 F8 U% S7 d. Z7 w x = a.name; for k=1:10000, sin(A(k)), end; + W8 `% b! x& b) G& g6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速: j2 z6 w% t8 ?7 ?. f! d9 C 度。 2 y* t C) j+ | D% L, a7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低* \7 i* z y& J9 J7 ~) y3 u 运行速度。- W& `) o5 n0 m9 x1 |

8 {! _: A. H6 H2 x4 Y3 V

二、 遵守三条规则6 t: J2 E4 E+ c! M# q - h) f7 z- t* {2 b1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic0 ^, t% t* c2 E2 P2 G5 ?! @% O% ~ h means it is designed ; G) x& j3 k2 d+ U5 T . j8 s3 e7 Z6 x( U3 g6 O2 ]4 zfor vector and matrix operations. You can often speed up your M-file c " L- m) C" c [ode by using8 ]/ N& W) u, c( Z5 {. }4 d+ J/ |6 M vectorizing algorithms that take advantage of this design. Vectorizati; s0 ~) X# p' ]6 ` on means converting! C( _# |2 y& ^ for and while loops to equivalent vector or matrix operations.”。改进 , j$ M+ E8 Y3 N8 L4 s这样的状况有两种方法: # ]0 j; T* l& I/ D7 T 5 S9 H# @1 q# G' f# x6 F) za、尽量用向量化的运算来代替循环操作。如将下面的程序: * R, Y: D O6 C- k6 S$ y; H# k# y6 Q% Z, W( K/ Y i=0; ' V) K. u7 y! b% H Efor t = 0:.01:10 + n7 [# `1 g5 ]) ]* u! _0 qi = i+1; + j5 _" p9 m& O5 by(i) = sin(t);$ m; {7 W5 B+ H8 t end0 }1 ~( J; ]7 K' f0 Y- l 替换为:) l4 {: w ~4 A0 S- a) B* C t = 0:.01:10; S Z$ Z2 O* I0 r( n: q y = sin(t); ; V- F7 a3 y, G' P+ ]速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i % L. y/ J' z }/ x1 Q" xpermute、permute、 ~/ L# @- o S v( Q7 x0 j reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums' a3 T& s( X3 `) B* O um、ind2sub、6 E6 _) |& M' A. [8 M* ^ ndgrid、repmat、sort、sum 等。 * d' K p+ _5 G0 E! x# y" M! M$ n: z- Q. K# z- a8 K0 ? 请注意matlan文档中还有这样一句补充:“Before taking the time to8 A! `+ f4 t3 a# l+ ` 9 {$ x0 Z) E6 `* z- L7 x5 k vectorize your code, read the section on Performance Acceleration.' w7 j5 K0 P) o, U You may be able to, l& c# o& k& o6 H9 P1 a6 Y speed up your program by just as much using the MATLAB JIT Accelera+ E: h5 w, A" r+ G. L6 s% G6 { tor instead of" L. I+ U y# r4 l( M vectorizing.”。何去何从,自己把握。 3 D6 {7 Z+ K Q# g0 @- ]8 a9 K4 B& K8 K2 ], ~ b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执* k* s; F n" o- K$ c2 r 行循环次数少的, 1 `- L4 c0 o! U' D内环执行循环次数多的。这样可以显著提高速度。 6 d+ i/ l4 v) V7 P5 Z1 \1 ]1 {# U; F9 S, T: J3 J$ ] 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on % t, J/ T$ t7 s+ ?5 a d% \+ \es、cell、struct、$ O; P7 H/ d6 j! R# I repmat等。) A# q- S; f) L3 K/ { b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:& t4 q# d# k! i5 T A7 S, ]& c ; N2 _: m" L V8 ~! Z' X3 Y A = int8(zeros(100)); 3 A: Q& t3 C- v; Z. F换成:( P( L! i. {* r; z7 E+ [( | A = repmat(int8(0), 100, 100);, m4 u6 |, x* I5 S+ V- E n% Z c、当需要扩充一个变量的大小、维数时使用repmat函数。 ; t% N6 `, d& j8 q9 v% O z$ S) }! } 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 7 c. e. H# ]3 f* }" I4 K8 eb、使用Functions而不是Scripts 。 # u% Y& t' Z2 Y- E9 K9 c

$ \/ Q- w3 a; U, ^# q# U

三、 绝招5 f" {2 P( K- `0 g, ] 4 c. @( r0 l+ H3 D% ~* Q: p3 N+ b* ?你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。6 t; e$ q0 A- t2 ?) L 1、改用更有效的算法 7 R! [# |$ b, P! g2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 % a3 D1 I0 q4 O& `8 l 0 F6 `* x+ t: z( J关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ 7 D2 @3 Y4 o! `1 z2 Q8 ~语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

& C; W0 }3 u [4 f2 {. i

加速之前应该先测试6 J% R3 W, @; N% _: E$ \ 使用profiler可以获得程序各个部分的耗时1 l) W) c; r5 I$ y2 v4 U 如此就能高效的加速 2 \5 Z W( a9 C! O3 Q; I' J* c

0 Q4 x t0 \) f% r

因为有的时候导致速度变慢的原因是逻辑结构不合理,# F; ~2 h+ V% U0 ^! E, J, E! g 而不涉及程序技术

+ p2 U. J; Q( o% \) P- r

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

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-7-11 22:13 , Processed in 0.492028 second(s), 91 queries .

回顶部