QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab + ~) L0 d f+ w1 ]# n2 [' N( {- P标 题: 加速matlab运行的三重境界 1 V$ v0 c. _5 i4 F: b发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)9 E9 e4 D N- B4 m5 E! r - n7 |, y9 c% D& ]- B, ]加速matlab运行的三重境界

) b# g; R8 N6 r" W+ y+ s 0 |5 ]" t1 q/ w& k3 g

一、 遵守Performance Acceleration的规则9 u( L! J, Q, B; F# R& Q1 t & _& s$ r- S c4 J关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 w% {+ H, [9 d其规则总结如下7条: 6 v4 r* i4 E! n5 ], F1、只有使用以下数据类型,matlab才会对其加速:( B# v% i: b+ i, ]- h+ g8 Q1 | z0 L logical,char,int8,uint8,int16,uint16,int32,uint32,double + F) k! @. \2 V B: N+ V! s! J而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu; H i! t$ q U' g* E8 j" I re,single,$ T% S- L# s6 M6 W& r+ o ' \4 l( M: y: Y' }! X( ifunction handle,java classes,user classes,int64,uint64, R8 u1 k- a9 t' V4 g+ J 2、matlab不会对超过三维的数组进行加速。 / G3 E! V+ e6 z7 W6 F& Y4 ?3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值! k) o \+ B/ K7 z) e 来表示;' j3 |+ A5 j6 M. L& N b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数& b$ K R& ~# t- A' w: O, o* } 据类型,只使用 ; n& {3 j5 `: y1 G3 v; O三维以下的数组;c、循环内只调用了内建函数(build-in function)。% \5 \- E+ p4 u0 G ?' g0 T/ O 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将& l- k7 U1 S% `) d } 加速运行。% _8 E, z1 z Z/ e 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: + y" h1 a6 p) h# J& Zx = a.name; for k=1:10000, sin(A(k)), end;" L0 \4 w' ?( i# k7 b4 W K1 P& t 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 8 U& R3 q8 U9 W! f0 r度。6 ^+ a* a G+ ~0 G2 _ 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低0 G8 Z, m6 y7 W# z% L 运行速度。! x4 `9 s2 j+ {" A1 `& _) p6 S

+ f$ Z+ v; ^: P5 h

二、 遵守三条规则& Y! M! s- R+ p4 u7 G, L, d # X" K" G; I' T+ P6 L: J1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic I* `9 p& o& Q, A) `# D h means it is designed3 K5 V. E1 c) }$ L; K) z, v' ] & R( ?# g* j+ X3 u& u: k" zfor vector and matrix operations. You can often speed up your M-file c0 [5 [) U, y0 J0 [, O ode by using . s8 n# l- D$ V6 P8 evectorizing algorithms that take advantage of this design. Vectorizati ) L# l1 C3 j1 l4 H. u# L( {on means converting 8 ?# k7 ]/ A' c Q0 V% k# e5 _for and while loops to equivalent vector or matrix operations.”。改进3 r2 \7 |+ Y$ w j 这样的状况有两种方法: 0 y% l0 e; _' ^ * @2 u! s% E- @; sa、尽量用向量化的运算来代替循环操作。如将下面的程序: ! n( x# E% R( O9 Z% f {9 N4 L $ u, I t- F) o+ Pi=0; 9 f& _5 @* o e% @/ ? Cfor t = 0:.01:10" X8 [- w1 {. `# q% R9 n i = i+1; / t, a, J; S8 h& [9 N5 X& Zy(i) = sin(t);. Q# k. S* {( J! H6 r end * i4 l' n3 A0 I; s替换为:2 e S5 c4 o0 O6 N, r* ~( |# B t = 0:.01:10; ) A* m! n- G u2 b, t }* x1 Ty = sin(t); 1 Z3 @0 e6 }0 i速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i 1 \- a+ f5 x! x$ e* Wpermute、permute、 0 }# R0 t+ P: t9 R4 D& q" Creshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums: D/ y! I$ J8 m8 K& o- k8 F um、ind2sub、6 L3 u3 G$ T/ ?, i# S1 r ndgrid、repmat、sort、sum 等。- W- [1 S# y9 L& s% }/ P7 N # l- a2 P F4 f3 F- S 请注意matlan文档中还有这样一句补充:“Before taking the time to T2 X5 ~2 A8 U, T . o( q8 L2 T# h5 I7 ]* @vectorize your code, read the section on Performance Acceleration.- F9 A8 [( r$ e9 ` You may be able to - v. H7 a: G6 J8 o% ?! uspeed up your program by just as much using the MATLAB JIT Accelera" ?/ T. q! r9 x- c$ h- R7 D tor instead of * b/ `+ n$ o& _9 J2 g6 E+ ~vectorizing.”。何去何从,自己把握。 , u' _3 P* @& d6 {& x$ a8 R; Y5 _# r7 |* S' ?; g b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执+ W$ f4 {1 k1 _6 }: ^$ R7 Z D 行循环次数少的, # Q1 w- ]4 p1 R/ E" Y7 u5 `+ b5 U内环执行循环次数多的。这样可以显著提高速度。 - d8 M7 U# [8 ^4 M + o8 |! ]& f& h6 m* g Y2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on : R; x! H9 ^$ T: f* ~es、cell、struct、 R3 T5 B' J3 m) M$ b# |4 A repmat等。 / |; N) i- `7 {6 S( _+ ub、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: & Y. R: r5 I. ~( v2 z# T! V4 E% N4 w6 ~& @8 x A = int8(zeros(100));. V8 p% Q* X, a3 g 换成:% F7 E# ]7 P0 k- N+ q A = repmat(int8(0), 100, 100); 5 K& `) y/ e y* G$ ~3 hc、当需要扩充一个变量的大小、维数时使用repmat函数。# A6 p! C4 a$ f/ {+ f/ i9 ~9 O/ e 8 f: |2 Y+ [9 c2 I4 b# T3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 8 w; g- U& Q2 Jb、使用Functions而不是Scripts 。 + ?* x" y! q' {4 }( }7 p- f# Z' B

( L# f8 r8 d- H5 o0 {

三、 绝招) S4 ~9 _2 d% \# `4 J* k 4 `# K" C+ S( C3 R" a你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 ' E+ Z4 q, r; g0 s8 p2 E1、改用更有效的算法 ) i# H. ~3 R# B/ `2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。* t/ p% K+ Z) @# f 3 T4 H3 B6 ^) x. F" u7 X5 L w% m 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++( K7 Z( y4 u4 v$ U; C% s u 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

( d2 t- a7 Q$ {2 M

加速之前应该先测试/ n# y* |1 H' X* P) G 使用profiler可以获得程序各个部分的耗时 # A9 }& ^! J i, P0 t0 d如此就能高效的加速 B: q' Z" p" K: e3 O

+ X }# g. G/ e

因为有的时候导致速度变慢的原因是逻辑结构不合理,: l, X: f8 i; e 而不涉及程序技术

# u6 d; b' y) Q/ U: n0 Z

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

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 20:24 , Processed in 0.404466 second(s), 91 queries .

回顶部