QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab) A# ~. i9 C- p2 j+ {$ D 标 题: 加速matlab运行的三重境界& S5 a5 k) ~# T1 u' P. B8 {, Y 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004); s" T- L. C, z' s 6 q6 B$ h/ L1 Y( K% U加速matlab运行的三重境界

# h# a. u" w% |# K- d! ~- @- S w4 E9 K

一、 遵守Performance Acceleration的规则 % }% P3 r$ F: H 2 d* w* R+ G6 J# w( {: w- g关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 * {9 L$ K# q; e- D其规则总结如下7条:: m; D7 Q1 \4 N+ V 1、只有使用以下数据类型,matlab才会对其加速:" S+ S7 Z; S1 `/ x. {/ B6 V+ c logical,char,int8,uint8,int16,uint16,int32,uint32,double ; c5 T7 J5 j9 | V7 n而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu9 `4 |, F- c% X: h% m re,single, ; A+ ?( N$ J, ? ! o6 |1 W1 m/ p z1 |* i/ z) bfunction handle,java classes,user classes,int64,uint64# o( G k. P$ u6 R8 w# |1 `2 B 2、matlab不会对超过三维的数组进行加速。 % S+ L+ ~6 `; V! O a7 s3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值5 {* s. p. O1 e- R1 k 来表示;4 ^5 S# G! v" Y0 j b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 ' U1 }$ D# V/ U据类型,只使用9 r* [, m, Q3 n8 q5 I& p& I 三维以下的数组;c、循环内只调用了内建函数(build-in function)。7 [# D) w7 H" S8 ^ F 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 4 c' q& p8 u8 b3 V- M3 l1 }加速运行。/ V! [$ }$ s5 {! n |' f8 j 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:5 e3 f3 q: i% d; a9 S x = a.name; for k=1:10000, sin(A(k)), end;( Y" r' t; ~) e/ `- U0 G 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 $ R, C& S9 F+ o; [度。3 @3 ?2 \! W0 s. @$ k 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低- e7 x& M) t; {6 a+ c5 l- Q 运行速度。+ E& d1 Z$ f# }" }0 y3 ~' ]

) o' e, |: L8 _

二、 遵守三条规则" P: H& m. H$ s) h2 g+ A, w4 A 7 O# _) J% o0 a5 U* f* ]8 t! o! h* J- J% ?1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic. b; O+ R* N3 M9 K0 n9 q! {% ? h means it is designed . R5 Q# ~1 n% w+ L" u9 Y( `3 F/ O" z* e3 ` w$ G( M3 ~ for vector and matrix operations. You can often speed up your M-file c 4 O; e9 |1 b% N, ?; E, ^" V! c& N Code by using( {9 ~! ^7 m1 h" q vectorizing algorithms that take advantage of this design. Vectorizati 0 ?7 s" b b- W. jon means converting 3 U7 D* E8 b0 U& Z( r# J5 |2 Wfor and while loops to equivalent vector or matrix operations.”。改进# t( E. O0 {# x. h& ^6 y: ` 这样的状况有两种方法: ! O4 Y: `2 i( A9 o/ W7 z , ?/ ]1 U2 l- ]! ~+ Ya、尽量用向量化的运算来代替循环操作。如将下面的程序: ; D9 |+ Y5 I/ f( G+ W- C; I ' i% D( U/ M! z2 T- ]3 @i=0;; L/ P4 U& o4 y( o# h5 g0 }: ` for t = 0:.01:10 , r! h) t7 G$ N ^0 gi = i+1; # a0 G1 L+ q7 J: I! F ~3 qy(i) = sin(t); 1 m6 U) Q; s/ o: X4 |end $ X: @% q i5 R& |! W替换为:4 J6 Q. S; l( |) u' @" T, w. r t = 0:.01:10; R! j ]; \& [# X" a y = sin(t); & {+ \9 H- J. m% U7 V8 Z$ T- I4 D速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i 0 N5 o% f0 \4 S5 Gpermute、permute、- L; N- C# L+ S" X7 D& p9 {. G reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums1 A: m3 g- s! h, b4 x um、ind2sub、( E. t0 C8 A& }% ?* c5 ~0 ]: i ndgrid、repmat、sort、sum 等。 r/ S7 M, A; q* E. M3 j: P ' |: ~' v+ m, M3 X. {9 e 请注意matlan文档中还有这样一句补充:“Before taking the time to 8 B( m1 g; ?9 j5 R 3 e( e7 P' A$ K9 k( u+ Tvectorize your code, read the section on Performance Acceleration.# {7 L3 J: H1 u4 Z You may be able to , o$ V0 y2 u% E* ]9 x7 [speed up your program by just as much using the MATLAB JIT Accelera: j6 L1 r5 M& Z+ T$ C tor instead of + N9 c9 {$ @- wvectorizing.”。何去何从,自己把握。 ( U% a* Q# g k7 j+ { + ?! ?- \, @% o6 N. w3 X3 `b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执7 X* p, i8 a! r 行循环次数少的,: j8 W& ]5 @0 p7 {: Y 内环执行循环次数多的。这样可以显著提高速度。& y" I3 S& l& e0 T- m; z( a% ~ e0 d* ?" f8 c: F0 J 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on3 x# Z n" O0 l* g& z: s es、cell、struct、! O* z; f6 k8 _, B0 f% O; y repmat等。 9 L6 u- W w$ Y6 Pb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: ; D% v5 ^' ]; r% G) x3 E! E! D. `% M" ?, s& A r u& A9 T A = int8(zeros(100));' H+ T& T6 n. O7 ~ 换成: , E; E, R. W" {4 b' ~A = repmat(int8(0), 100, 100);" e, N! C( Y' \1 g: I+ A# z3 e6 F c、当需要扩充一个变量的大小、维数时使用repmat函数。% m' J- f" g& x: U s + ?# A1 {9 A! `3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。' y) l. E, y+ k7 m7 y! C b、使用Functions而不是Scripts 。 ( f- {" t5 ~- q+ b2 _) z V

% M# S0 h9 }' | z( }- p

三、 绝招 ! u; ^+ ^" N: s- u+ D6 o/ T 7 ^2 Y! a; \! P# v你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。. _, G/ H7 X8 y( u5 |1 O- \ 1、改用更有效的算法 " I4 D9 g, r6 ]0 W$ h% A2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 8 g5 G3 K l+ c5 b2 T5 L3 B( J) P E7 [# F+ x' [. ~9 m 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ % @6 @! v$ ^$ c$ [; a1 c* Y" {8 L语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

) f" A, \2 J$ p3 U) {6 X

加速之前应该先测试 & B" ^3 e6 D$ @使用profiler可以获得程序各个部分的耗时- m" p- b* _9 t. Q9 [. R 如此就能高效的加速' a5 f0 M/ H) s8 o4 r

; p0 @! d, o7 o

因为有的时候导致速度变慢的原因是逻辑结构不合理, : Y Z' Y# Q" F* u2 X$ ]$ q) p$ k$ T而不涉及程序技术

4 H. ]; U# D% M' L$ }4 M$ K- d1 C8 [

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

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 04:26 , Processed in 0.505582 second(s), 91 queries .

回顶部