QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab( D3 Z P' ~7 L! ? 标 题: 加速matlab运行的三重境界 5 {6 G2 `+ w- i @1 v. L发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)1 N: Z0 h0 d9 k ' H! Y1 z( U0 o0 O. H' }加速matlab运行的三重境界

% s4 {" Y8 ]- ?9 Q: Z4 b* \, E- B1 V" a7 m

一、 遵守Performance Acceleration的规则. C7 _6 Q' u- v+ t6 \: { 1 S2 v/ e m$ ]. M n3 ^& y1 r- q 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将9 C9 x. N7 J, X3 ~. \+ h 其规则总结如下7条:; ^# \7 T+ k4 M8 l5 |- M0 @ 1、只有使用以下数据类型,matlab才会对其加速:- ^& ?* _/ Z: @) j/ ^6 g logical,char,int8,uint8,int16,uint16,int32,uint32,double ( M" z- O6 y$ ?$ ~3 u% {* ?6 V( L而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu$ y3 B3 d# F; @; e; g0 T re,single, # S& T% c( K8 V6 b$ z( E9 t3 K" o 4 P. q" @/ u$ \3 h' ^% @function handle,java classes,user classes,int64,uint64 % d2 o0 M6 J8 F* Z2、matlab不会对超过三维的数组进行加速。 / y3 _& }7 |4 j- @: \% h9 F) p3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 ! u- U7 P9 Q2 a: y来表示; 7 V9 |4 M, O2 {8 d( W, l, Pb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 P. [: \6 P. K: y' d' x1 b据类型,只使用+ a2 @. a% h1 I 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 $ H6 O8 X! s6 P, s/ D4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将! C2 d, d- K9 s3 q& I- J) a 加速运行。) [0 G% G0 R j) ? ]7 C' e; x 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:, C0 B5 S) a2 o% O x = a.name; for k=1:10000, sin(A(k)), end; $ g( W' ?2 E8 f! W6 I% h2 n6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 ( o+ W# x1 Y9 w4 Z) E1 ?! u5 H9 W4 ^度。" i4 g+ ]; u8 x* G* z 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 ) {1 f A: s4 g- h( ^$ C' J' N3 c- d运行速度。+ K" y a+ o M, u' z

! j1 Y' ~. W$ h2 e) }9 E( M

二、 遵守三条规则 + M; ]7 {4 L, @1 R8 u2 r- V 0 Q% Y5 v% j& C1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 7 ^3 p& M) e* U" M/ E" Vh means it is designed & r2 s) X# P: f2 C: O5 {5 O; d4 F% m( i% H' { for vector and matrix operations. You can often speed up your M-file c . T# @6 [4 f+ d; A1 v. Bode by using " P, {3 H, e, n& N. evectorizing algorithms that take advantage of this design. Vectorizati " c2 v! O& t; @: \- O3 O2 Ron means converting ! c( r5 l; H6 \/ Wfor and while loops to equivalent vector or matrix operations.”。改进9 c1 U. }- o7 ?0 p- r 这样的状况有两种方法: ! B' y' c2 i% ~$ a% N, d! _/ h1 z8 W6 |3 z; D) ^ a、尽量用向量化的运算来代替循环操作。如将下面的程序: # }% p" Q7 w& ?, j7 q 9 Z! r8 Q3 R5 J! u3 ji=0; 4 ]. f3 _0 `# pfor t = 0:.01:10 ! B" C( i7 }# n; X" B0 ~4 |i = i+1; 0 m. ?: }& y; A" _/ }; h5 [y(i) = sin(t); % I, Q; ^. E8 @6 y! h3 pend 2 e3 J, K/ U0 y替换为: 7 ], S$ Q( v5 mt = 0:.01:10; & P( H' E) J' h% O& T; R; y2 `y = sin(t);! ~( v, R+ x) I V$ b0 A 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i % b' x: z! B' }) Mpermute、permute、 + z& ^! \( D# j: V/ W3 g+ Yreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums+ e9 P! O* o b0 S; P P& s$ U um、ind2sub、 " `+ o- t8 B" }& J8 xndgrid、repmat、sort、sum 等。; h- j1 H. O' j 6 y" b+ Z @ L* b, Z请注意matlan文档中还有这样一句补充:“Before taking the time to 4 k1 i- t" ~; J& h, w, l- b$ r ! J7 K" n5 t6 O: e+ Q5 pvectorize your code, read the section on Performance Acceleration. 9 C" M7 O& u% X @- QYou may be able to. C- {: O* z3 `, x' Z, s6 G speed up your program by just as much using the MATLAB JIT Accelera& L- F' i7 `! @# ~0 N, Y* m tor instead of & k: V8 N8 V7 A+ R- E6 I$ R# V7 wvectorizing.”。何去何从,自己把握。! e0 X) W! I, I7 r2 `5 A$ D & s, M8 W5 U( y' `; y" { b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执6 {' _& w' r1 @. Y 行循环次数少的,& c& g% k6 H2 G 内环执行循环次数多的。这样可以显著提高速度。2 l W) d. o- k ' Z/ {3 i* @9 g/ u+ \2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on$ b" o8 d) q% Q2 ~0 L4 x es、cell、struct、 % }* x8 ]4 F3 X1 t/ ~, f3 }- }repmat等。% A# X4 s0 E8 R9 x# v* Q b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:0 [+ C1 g1 U) v7 k1 Q5 k 9 N' q/ J+ {0 g+ p' TA = int8(zeros(100));" e0 ?+ {0 @! L$ F 换成:( ?- h+ ]& D7 I1 h; y A = repmat(int8(0), 100, 100); 1 B% p" K$ B7 L1 k) ^6 U5 C0 qc、当需要扩充一个变量的大小、维数时使用repmat函数。7 p0 f4 B- b }9 H) A % R2 A7 _. P% w8 k. _ 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 $ N' C0 I/ x2 ?3 Q, zb、使用Functions而不是Scripts 。! } I( n! V* \1 `3 s

+ m: k+ _9 u5 N' P' ]2 E+ M' ?; @

三、 绝招 + o/ P8 }: L7 g* L% R' Y6 o" W . w( z- d' P( R3 _2 B: ~你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。) y; m( N$ U; y5 ]3 Y9 [$ } 1、改用更有效的算法, u4 Z6 i# c% E 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 4 |- W4 S5 ?/ R; L: n' }4 D! B5 l ; v7 n1 o0 R$ |" Q$ ~关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++5 C9 B/ r3 b' P- X9 v 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

6 N& o" w) v/ A9 t

加速之前应该先测试* c* [% ~) D3 y 使用profiler可以获得程序各个部分的耗时 1 V& q' Q) C2 d: M& t" E如此就能高效的加速 2 _. A) {3 F9 D4 k7 [9 m3 |8 Q& `

9 o* K" n; n$ B# d1 ~

因为有的时候导致速度变慢的原因是逻辑结构不合理,! b# P+ E( i! c- f% @ 而不涉及程序技术

, f, j! n7 Q. g6 J, [/ y9 y

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

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

回顶部