QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab" U3 z- I, Y' Z0 n k 标 题: 加速matlab运行的三重境界 . a, M" b8 B! J* e& Y8 c/ V( B发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)0 v H' ^% Q6 _, J, p 5 L1 v9 G9 Y4 @( p- R$ `5 k加速matlab运行的三重境界

5 g& D; t" O1 E$ c( u 5 @# t1 r. S( Y2 h4 b0 x) R2 w! ~

一、 遵守Performance Acceleration的规则 4 F1 V9 G/ i' q/ M( s " f" c7 L, ]/ d4 `关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将4 K0 Q8 {- j$ P5 H7 \& B, r: z 其规则总结如下7条:' c$ x* I5 F7 p* ] 1、只有使用以下数据类型,matlab才会对其加速: - @6 M9 Y2 I3 x/ ulogical,char,int8,uint8,int16,uint16,int32,uint32,double4 @; e! [) D+ h) b. X8 B2 K9 P 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu o/ F l1 a, x* N" Ere,single,* n. \5 i9 O$ [% a) k: O ) Q! X& J- I2 d( L0 G+ r function handle,java classes,user classes,int64,uint643 o/ Y: i) X9 T5 N7 V3 X8 [" f* X5 s 2、matlab不会对超过三维的数组进行加速。 4 Z% M* K7 V8 P! Z1 a3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 # J% N ?5 e; @5 @$ v1 q来表示; * @1 g% h9 ]7 ^7 n g7 u- _, Eb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 ! t* l5 G/ T( L4 m据类型,只使用- X. a/ f) z. O' }- }: d: h- @& R 三维以下的数组;c、循环内只调用了内建函数(build-in function)。, S0 R7 Q. u6 Z4 V 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 # [* k7 q' G% T! m8 r加速运行。1 D2 m7 o/ C9 P* T8 z* l$ T3 W7 [) Q 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:; X; S/ s( x% f, P* S& N) Z x = a.name; for k=1:10000, sin(A(k)), end; + ^" N# t2 G& q6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 , Z O' U8 a) A/ |5 s5 [$ N! a度。7 S- K, ~1 V) `8 R 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 ; |3 Q% o6 }4 i' |' n9 |3 J7 N, ?运行速度。" Q/ [ @% U. ?. ~0 ~8 E

5 a8 q: R/ m$ o+ j! } Q

二、 遵守三条规则' P3 L. ? v; ^/ p( d% U' d & g0 H# `$ h6 Z; |2 @( m9 i+ R) ? 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 2 \; l, E G4 ch means it is designed , A; b G# l# C5 F% z' q8 x; U+ k% } for vector and matrix operations. You can often speed up your M-file c7 \* m ~: Z1 H. n2 ? ode by using5 G1 |9 {' H5 t | vectorizing algorithms that take advantage of this design. Vectorizati % A" z% }1 E% e: j7 v2 g. Non means converting; W3 q) m2 Y3 | |+ z* @$ [0 U for and while loops to equivalent vector or matrix operations.”。改进 3 Y, [- a& {2 G0 L! h& h这样的状况有两种方法:+ A- H8 i' }3 n, b/ N9 J# v. R , {9 B M8 h; V8 [ a、尽量用向量化的运算来代替循环操作。如将下面的程序: . L2 b! _" E& |* ~2 L3 ]4 u + r1 ~2 a, ~) w7 H3 d, b; ui=0;* f: @# r' l5 O+ L" q' f for t = 0:.01:107 k; q2 f/ I( W: Z! o i = i+1; 1 `4 w& C+ h+ }y(i) = sin(t); ( }3 h" g. T$ h1 M3 g3 x5 k: I3 R Iend 4 b3 f2 ]5 Y. q# }: h; a替换为: ; f n3 b% _4 D2 S) }) mt = 0:.01:10; 7 {: i/ q. N/ @% T3 }1 Ny = sin(t);( k9 z7 q' X+ C' x6 J, N1 [ 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i " U; Q- X* _" J3 [* r1 M$ Y1 }permute、permute、 5 P! h: M4 z' \& E8 g; S3 @reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums, {2 Y' Z4 F$ W2 O6 ~ um、ind2sub、 ! v8 Z' U5 _7 Z# H# q$ E8 n5 |2 Andgrid、repmat、sort、sum 等。 4 Q- G( c8 N4 r5 v9 U2 `8 w e7 e 7 b. W$ N0 f4 I, _7 j9 f, E2 J+ o请注意matlan文档中还有这样一句补充:“Before taking the time to9 _7 U& j* [& q5 O / |6 l# S( f, |- j vectorize your code, read the section on Performance Acceleration. * l/ R3 [9 H0 ]/ Q+ J% x0 zYou may be able to. i) g- s. G3 q) }' |9 K8 B5 I; l speed up your program by just as much using the MATLAB JIT Accelera% X3 y* c4 `* y$ i4 p tor instead of9 ?6 f0 G0 t% }0 L" q* k, x K. B vectorizing.”。何去何从,自己把握。- P) U: M6 l& k5 t7 R+ M# O( v/ d 6 F: Y# @6 X$ j7 H8 |0 sb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执$ k9 e( |7 V* q% H( X* t( ` 行循环次数少的, 9 `+ i7 D5 H s' ~3 z内环执行循环次数多的。这样可以显著提高速度。 " [7 s' B7 Y8 ]1 \9 Y0 r0 ` 2 N) j& v0 n9 F3 J6 T2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on0 O; |! ]( e8 K6 G es、cell、struct、 ; f8 V o6 |# D; F: G5 Drepmat等。 ( h9 S3 Q) ^, T: P- _$ k& @b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:7 i% C6 n8 P: ?. d4 T) w ! y* Z# {+ x6 WA = int8(zeros(100));( \( [' J* K6 P. a3 ~ 换成:: g7 m3 ~0 L1 f& Z A = repmat(int8(0), 100, 100);# I- I( [/ P O- o! F( [ c、当需要扩充一个变量的大小、维数时使用repmat函数。 + n, O& q7 f: R, b+ X . r$ H1 A1 c, n9 U9 U/ g3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。9 y H( y* @3 n b、使用Functions而不是Scripts 。: Q7 |# `1 w( s) B/ ?5 R& {9 B

1 _+ O" Z9 O" p( I

三、 绝招$ {$ e# m! ~3 }+ k/ b4 m5 w- ~ g Y8 ?3 c* e9 G+ p7 E你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& O4 t6 r) c0 S 1、改用更有效的算法+ ]% ~; x' S8 ] M, [# i+ u 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。* Q0 {" V8 a) m( e + @: b0 {& a0 t3 Y3 w- I# k关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ L* `2 f( l- |- z, m1 D 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

1 w# a# y3 v* L: R( x {

加速之前应该先测试 ; H0 [* w+ h3 G0 l: Y使用profiler可以获得程序各个部分的耗时$ ]: K6 _3 s5 u$ T2 p6 D 如此就能高效的加速 & k" c8 l4 I9 A; n0 K5 d

5 b; J. Y- g5 t% T

因为有的时候导致速度变慢的原因是逻辑结构不合理,: t0 ?" D! v g! t$ S# |5 V 而不涉及程序技术

5 W9 _, s7 Q) e, G/ [0 p$ X. u+ ]

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

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 12:46 , Processed in 0.540213 second(s), 91 queries .

回顶部