QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 6 a4 B0 p4 v* @& V! C* d标 题: 加速matlab运行的三重境界# G: I3 z2 \" u9 ]. `5 M8 d( Z 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)( L; ^/ I! S2 O% g' F$ i, o4 f- y; Q n ( t3 x+ ?) l3 s9 h1 e$ N$ \0 r; R 加速matlab运行的三重境界

1 \4 ~* Y: _: X: a( m1 l 9 y. M0 ?8 r0 _

一、 遵守Performance Acceleration的规则 1 t6 `! E. v) P' D4 w ( Y$ U; n- r% m! P5 x3 L关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# Y c: X( [' a+ b6 i: T5 U# N 其规则总结如下7条: 9 T. X4 ?6 T m7 I2 o* H% V ?1、只有使用以下数据类型,matlab才会对其加速: " t2 K; T' D( h" b+ U9 A0 M+ V" jlogical,char,int8,uint8,int16,uint16,int32,uint32,double5 G/ c& v0 V7 ]/ f0 t8 K0 G0 M 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu 8 Q% p: H! ^* C! B# L0 D/ Mre,single, " c: r7 Z/ T/ a k) c5 s( p2 Z# j8 `/ v, d9 |; }; G$ q, z function handle,java classes,user classes,int64,uint64 : O" u& z |( |- P1 I* @# E2、matlab不会对超过三维的数组进行加速。; C0 S9 w) K# z 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 * ?' @- a- o; q) {来表示;9 ~( `+ ?8 _( N! X b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数, e# p I8 u r9 Z# r 据类型,只使用) J% G, Q& L- p 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 7 n) k7 F- ^" B$ D3 u4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将2 |" ~+ P& Y( W6 I$ V2 T, C8 t& M0 W 加速运行。 1 x" K! N8 J- Q# J3 ]5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:- l4 F2 D/ C, ^, E$ [7 s; }5 { x = a.name; for k=1:10000, sin(A(k)), end; ! c! t# \3 U, h5 f' N* w# ^7 T6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 0 o3 y$ Y8 v0 c度。+ x# F$ E" r: X7 t { 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低/ n+ I% J2 ?! n. j3 }0 B# f 运行速度。 & d, M5 Q, L% [% u- O& |6 F

% @, D) A8 Y6 W

二、 遵守三条规则 0 f) ^/ T+ |3 D7 Z, ~ " b! n9 E; V" W3 [1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic & N1 G' I* c; |+ t2 m9 Zh means it is designed C* v! T6 J1 p* `: M9 a9 b' K) s2 J% X. a for vector and matrix operations. You can often speed up your M-file c ) U5 N9 U; [/ v& j. S" Uode by using7 g! p0 @8 A' r8 ~1 H2 P vectorizing algorithms that take advantage of this design. Vectorizati . W- ^0 F) d4 U* r6 Oon means converting 2 Q1 ]$ Y( e! Nfor and while loops to equivalent vector or matrix operations.”。改进 3 D+ T% o7 j. k4 F这样的状况有两种方法: 4 N& y5 R7 T6 g 8 F6 G8 H& E0 O: L7 @a、尽量用向量化的运算来代替循环操作。如将下面的程序:9 ?, k/ J$ |4 Z6 Y! M9 G , H5 d L8 R% B u# y7 ni=0; ( I2 j1 I' T" c6 L2 Kfor t = 0:.01:102 j7 Z% A5 S$ w6 {2 \- J i = i+1; 1 Y4 h4 u6 j$ y2 H; E; t5 ry(i) = sin(t); " F. ~; P3 l9 O0 P8 h+ Jend' f# d3 K& }; t* [5 h0 K 替换为:8 G6 E0 `- r, l9 ]8 b t = 0:.01:10; 9 p5 F1 R/ D' W9 K {3 O9 H: e5 ky = sin(t); 4 h0 W* r3 ]! y& ^- v1 I速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i* p" \) s# p0 [& ]1 o8 B permute、permute、 $ L! \- L t2 }reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums8 b! {' F c" v2 g um、ind2sub、4 X( n, W* P3 D ndgrid、repmat、sort、sum 等。0 R6 L2 C, r2 E6 m! z+ a ! q0 t7 |7 X. ^& @+ V* o 请注意matlan文档中还有这样一句补充:“Before taking the time to ! {( b' U+ j) Y$ W2 t. Q 8 ]- Y" j" i& y, G0 E. u. Q5 `vectorize your code, read the section on Performance Acceleration. % U. F4 w6 g' d0 Z7 C2 M) wYou may be able to 0 o x" Q" g/ i* l: ]speed up your program by just as much using the MATLAB JIT Accelera 4 s+ k1 s# d( Itor instead of ; t/ E. m, G8 a$ c( @* ^2 h' {( e' |6 avectorizing.”。何去何从,自己把握。 3 Q% s2 }! v8 f: x5 o# X2 W. h( O7 C* ^" p b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 9 C0 B6 g Z. W9 j8 L: S K5 u行循环次数少的, ; ?% ?8 ~, K3 K内环执行循环次数多的。这样可以显著提高速度。) Y% }( b2 F7 l) F. s1 I& D# | # u( f# w9 {/ T' Y* W% N, B, C+ L2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on2 Y' J4 K) [# R% z1 \; M es、cell、struct、 4 {# d* I: h6 Q' Y0 ^8 Trepmat等。 / O3 j; S- W: V' T& tb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: 3 y$ C' Q6 N7 E9 @' ^% A% w, S+ Q4 f- }+ z" v8 b! |) u A = int8(zeros(100));0 {: d$ z* }- ~6 m6 r1 B* J 换成: 9 F* u u0 |7 L1 h, sA = repmat(int8(0), 100, 100);7 g. B0 g4 F, M( O1 e4 Z O' [7 g c、当需要扩充一个变量的大小、维数时使用repmat函数。# p. ^ _0 |6 N3 Y) v % L7 \- t h" P- r& E 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 3 @0 b% z% x5 `& |b、使用Functions而不是Scripts 。 , u4 t. x: P, o( k. q* ]

$ F4 Q) E! n8 e7 Y* W

三、 绝招 o* l% ?$ f2 [7 N7 ^7 o$ ]. c- o* @0 {4 J 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。6 v K3 x* o7 P8 h1 y j: W4 k$ z* {% M 1、改用更有效的算法, h! q$ I+ v% d+ C$ Y9 W3 l 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。) s4 p" F; K! y 1 c/ F0 P- |! j1 M; h 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++5 f: u) F% g" J* @# v% D3 r- G3 i 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

0 e9 w& Y( X* W! m

加速之前应该先测试 y9 V1 `0 l2 @4 C& n6 U, F使用profiler可以获得程序各个部分的耗时 ; D4 l8 N) A1 |如此就能高效的加速5 _) o- j% ?; b- v

, u6 c/ L* V: |+ _2 p0 F G

因为有的时候导致速度变慢的原因是逻辑结构不合理,! r4 [: y: P* A; X 而不涉及程序技术

8 b8 R+ E2 T& G

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

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:08 , Processed in 0.516453 second(s), 91 queries .

回顶部