找回密码
 注册
关于网站域名变更的通知
查看: 553|回复: 1
打印 上一主题 下一主题

加速matlab运行的三重境界

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-9-10 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一、 遵守PeRFormance Acceleration的规则
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
. k) D% x2 ?4 R: V. j其规则总结如下7条:  }) m1 q5 K+ r% f% z5 t
1、只有使用以下数据类型,matlab才会对其加速:
- ~# g+ I3 T2 M& K' Llogical,char,int8,uint8,int16,uint16,int32,uint32,double9 b4 U" T5 E3 o
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu4 h  Y% D5 h6 M/ N
re,single,
function handle,java classes,user classes,int64,uint64
. B/ {. z6 u" K4 U- I5 o; n; E2、matlab不会对超过三维的数组进行加速。
$ e# ^( |+ W* S9 x3 |3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
7 k2 m/ z) S7 r) ?5 {' }. X, N( _来表示;
- y$ W$ |) t9 J- kb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
4 Q) [& y# w- o5 p9 w, p* _+ I据类型,只使用
2 k# ^; @& U3 ]. |6 V$ H三维以下的数组;c、循环内只调用了内建函数(build-in function)。2 v# R, Y9 l9 T: |) N
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将4 ~1 R0 Y9 U( ^. X4 ?
加速运行。: o$ F9 E3 A/ X5 c1 b% M
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:9 g3 {" w5 V( k! Z% v) A: N$ e
x = a.name; for k=1:10000, sin(A(k)), end;
8 P% e$ ?6 X9 }$ s  H; e: |6 S6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
+ ]: i. r2 r- ~$ ^8 I度。
4 [1 S0 \1 s; ~) Z% D7 |7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
2 f. ?3 w9 U8 p% }& r. G4 B运行速度。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 R9 e/ K5 V9 Y( i) l' `2 F
%%%%%%%%%%%%%%%%%%%%%%%
8 }- f, T4 @6 d' o, P6 b) E  b' t二、 遵守三条规则
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
7 D! B0 c& @; i% ~. a2 s8 [& |, e) h3 Nh means it is designed
for vector and matrix operations. You can often speed up your M-file c
' k+ m2 }& a; s+ V5 G; b/ Rode by using; ~9 r7 A/ ^7 ]( p8 O+ v
vectorizing algorithms that take advantage of this design. Vectorizati% A+ }& D$ {) e' Y# c, X% ?
on means converting
  u  s5 e+ z4 F! H0 ]+ w1 e' Ifor and while loops to equivalent vector or matrix operations.”。改进5 B2 y. x" F- N# H/ n. k2 }
这样的状况有两种方法:
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
i=0;# V* _# k0 T, E* s4 D0 v+ \: o+ V1 o
for t = 0:.01:10: K- k3 _3 q4 D( n4 D! U
i = i+1;  U- j- B+ W  H! l
y(i) = sin(t);
9 |( B; J( @! oend8 [: N# h5 q5 V3 M
替换为:
8 E. M: d! j7 u3 K6 L* s2 ?  i2 Kt = 0:.01:10;# V, n! N7 R! v6 Y$ H3 m
y = sin(t);  a6 W  P) c0 K5 b
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i8 y3 I" o; _5 E
permute、permute、0 m3 a( t/ h7 b; J1 Y1 d
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
" H. W, q8 C, [) ~5 r2 Lum、ind2sub、
: R$ U! G8 T( X$ k- pndgrid、repmat、sort、sum 等。
请注意matlan文档中还有这样一句补充:“Before taking the time to
vectorize your code, read the section on Performance Acceleration.
. p6 `' F7 R8 a4 \You may be able to
8 |3 ~$ I4 S/ O+ h/ ^/ I: v6 D3 [6 Jspeed up your program by just as much using the MATLAB JIT Accelera
" D! w$ i6 h& B) T* jtor instead of
3 e1 _5 q) p4 t% B& _0 N. m5 fvectorizing.”。何去何从,自己把握。
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
3 G; Z( @5 F/ x& x行循环次数少的,
# X3 \5 X3 O+ g# Q内环执行循环次数多的。这样可以显著提高速度。
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on) z0 g9 J7 a7 J2 z/ c% O3 d
es、cell、struct、
$ Q2 y* z6 U7 ^3 a( h  {repmat等。4 o/ f9 S* E: r1 |7 r/ R5 p$ I  J  s* J
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
A = int8(zeros(100));
7 O% F0 `5 k3 @5 y, T换成:6 b+ V+ c* ]. V
A = repmat(int8(0), 100, 100);
4 Z) _, r* p- \c、当需要扩充一个变量的大小、维数时使用repmat函数。
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。* H1 d$ Z) J4 i% a" N: k) z# B/ O
b、使用Functions而不是Scripts 。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; x0 A. N9 D1 _, l% e" t' i9 ~%%%%%%%%%%%%%%%%%%%%%%%! n; d: Y; E- q" W
三、 绝招
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
0 A5 H' m# q  e- E7 l( i1、改用更有效的算法2 G7 ^* W4 Q1 ~6 t) T
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。3 j6 M0 g5 Q, J, l( z5 P6 ]2 p( _
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧

4 K& J" ]# Z# Y% V7 P: R6 Z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-20 05:15 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表