QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 1 Z P! v8 c7 B# Y$ c8 J [标 题: 加速matlab运行的三重境界+ C5 v: M0 @6 S1 x0 }3 ]4 j' m 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 6 ]4 c8 m% b3 M1 x 9 P/ U" ^# U* @4 r加速matlab运行的三重境界

" z# ]" B3 J( e0 } ! _; j7 Q& o ?8 Z$ Q l6 H' z

一、 遵守Performance Acceleration的规则 $ B: C) J( V( ? / V, A7 J7 i3 d关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将4 K$ O+ L- _ X+ D+ y2 o 其规则总结如下7条: : c) n# N" i2 y% @# J% F' h5 S1、只有使用以下数据类型,matlab才会对其加速:4 |, C2 D2 v, c2 j logical,char,int8,uint8,int16,uint16,int32,uint32,double u$ I2 t9 e! Z而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu ! [' \; `' c- \/ _re,single, ' _* o( |8 p+ V $ s1 \3 u' N0 Q- Xfunction handle,java classes,user classes,int64,uint64 . k& |" t# `0 `8 b: b2、matlab不会对超过三维的数组进行加速。 9 s; ?$ D7 J3 A3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值# A+ P3 F5 l; w0 W* n5 G% @3 ` 来表示; Z' B4 C, g3 D& Vb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数* z$ h5 e) v* W 据类型,只使用 - |2 F) Z% T* l7 x! H三维以下的数组;c、循环内只调用了内建函数(build-in function)。 [* a# X1 w# R. T# |4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 . f& @1 Y; H% G5 S, |; E加速运行。$ _) Q3 _* L2 ^; i0 o5 ~/ O 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:% B$ s, j2 t W# C/ m; j# {8 l x = a.name; for k=1:10000, sin(A(k)), end;. h& z8 S7 h5 _ 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 : z; ~1 U& \& U) b9 F度。8 H, S1 f/ p! Y7 C# T& E. F: } 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 ; K5 _+ i5 N" Q7 g& z运行速度。$ j! I- F7 ]- u; O1 d2 U

5 A0 L7 V4 `& \* i

二、 遵守三条规则 6 r! B6 F- Y v- T0 T! `" l1 T' b Z9 C9 F 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic ( e% I3 A( B) d* K+ d' S) ~h means it is designed : t R; k8 f9 ^* J" m( Z5 } 9 A8 d* o2 G5 Sfor vector and matrix operations. You can often speed up your M-file c( p+ n2 V+ v! h: K* C+ h4 O ode by using - ]) D8 i/ ~" b. ^# W% Gvectorizing algorithms that take advantage of this design. Vectorizati ) e3 P S: o, j, A# e$ ^5 q6 H6 Von means converting 9 O* A: w# m# tfor and while loops to equivalent vector or matrix operations.”。改进 ( J/ \2 m! _+ l这样的状况有两种方法: * H2 P, {; H/ B4 j0 \ 0 W2 v4 q* j$ b4 w3 v) D/ L2 va、尽量用向量化的运算来代替循环操作。如将下面的程序:3 f, u4 C. ]) V3 C* Y6 }6 v% r" w ' z+ t" E$ d0 w& |6 | i=0; * l' C" j' G. `7 n- k( yfor t = 0:.01:10 $ w0 W( @9 V; d. O) T- Si = i+1;8 f- ]/ [' m) E, n, ?- i# c y(i) = sin(t);7 d+ s5 w# V5 x2 o0 u end$ j! E; F( S D/ Q& K9 J 替换为: / R3 ^2 `) ?( {- X7 S: }% g* It = 0:.01:10;1 R! [% k& P, x' i! i2 Q. g y = sin(t); 8 y& R: Y W* q. u; x2 R1 D \速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i) A: |' v8 }( L0 U8 k' x, m. m permute、permute、* S$ M- @- |% U; y reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums , m0 _5 m3 o( z. w3 hum、ind2sub、 ( Z9 e# d' d1 q* \0 }ndgrid、repmat、sort、sum 等。 8 G5 t& s" |' _5 x& s$ D3 A0 \* @8 s/ A0 I# b6 C! X$ `2 X 请注意matlan文档中还有这样一句补充:“Before taking the time to : s- v o, |' t + {) o: `0 R! n" c+ D( g# zvectorize your code, read the section on Performance Acceleration. 6 i& H# _9 N. a; e3 vYou may be able to 6 H% e4 b- E0 M( T2 ^( @) bspeed up your program by just as much using the MATLAB JIT Accelera) F* l7 E% B [ O7 x' `, G tor instead of. ^% d- y& M4 d7 I( i1 c8 Z vectorizing.”。何去何从,自己把握。 ' K7 Z1 h: E" z9 Q8 [8 [" ?$ A+ _' f: t# ^7 Y b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执+ x& ~) d2 s+ g( o& m3 p. G 行循环次数少的,/ p2 D9 d; r7 l 内环执行循环次数多的。这样可以显著提高速度。' z3 _: ~, q& } `: r! y2 U 9 i( S2 w/ D! O9 R. ` 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on7 ?' m- z' D* Y4 H es、cell、struct、 \2 ^+ |) P7 b: @, z1 d8 Arepmat等。 % @7 n5 h% q: [3 T7 }1 Hb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: I/ p/ }3 q5 q( F ( g/ ^% D9 V8 K3 UA = int8(zeros(100)); 7 W" H! D5 `- J) e换成:9 e# C: A: \0 B' _/ C7 |$ ?' u A = repmat(int8(0), 100, 100);1 o. }" _% h U! N' ~2 D, ?2 \ c、当需要扩充一个变量的大小、维数时使用repmat函数。 ; a. s9 b" N" i6 p; n $ B; R# X v6 b1 d3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。& M5 Y v* d4 i7 h. R8 X- r6 m4 ^, @ b、使用Functions而不是Scripts 。 ! ^. V7 [/ ^% X8 \ ?

& r7 J8 W$ n) |0 }" g, o

三、 绝招 5 C6 i6 E5 L) }" b4 g" }$ g : C& s$ K8 [6 w# O! I你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 W: o, u; w9 k7 N; i9 L1、改用更有效的算法* X5 K% F% E1 M: u. }" [- R7 G 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 0 g X6 |1 F0 f, N % e# k- \1 Z' I$ p& ^5 B/ c+ x关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++* k7 U% A: @% Y" S# @: y 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

* ?, n' t) i5 N4 B) Y# ~ H8 b( T

加速之前应该先测试$ D* [& I1 x+ c+ |" ?/ M+ z* l5 Y4 z 使用profiler可以获得程序各个部分的耗时 A* F' k ?$ s: k/ ] 如此就能高效的加速4 C8 ~: m A5 X4 \8 y

X- `% D, U. e5 E0 g- b

因为有的时候导致速度变慢的原因是逻辑结构不合理, / c7 \' u& u( B2 X% W而不涉及程序技术

1 y8 b6 z( C- R6 `3 i

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

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 18:53 , Processed in 1.774095 second(s), 91 queries .

回顶部