找回密码
 注册
查看: 529|回复: 1
打印 上一主题 下一主题

加速matlab运行的三重境界

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、 遵守PeRFormance Acceleration的规则
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将+ O. N0 V9 P" h$ [$ s
其规则总结如下7条:
) g/ i5 }% w: ~0 H" W; O1、只有使用以下数据类型,matlab才会对其加速:& W! N. _4 ?5 k8 _- l
logical,char,int8,uint8,int16,uint16,int32,uint32,double3 t7 c2 z" N. a; Q# G' I" V
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
% r  K% r9 Q+ j% Q. s' Q" {4 Nre,single,
function handle,java classes,user classes,int64,uint64- n# ^* R2 r' t( C+ s) s: E/ R
2、matlab不会对超过三维的数组进行加速。
: H) S/ |; b  B, R6 z% \9 Z# v3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值4 Y8 {! K) S' i& O
来表示;
  {0 a# r& B/ y3 J: |b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
' o4 h4 e5 q5 ^; b) e' n据类型,只使用1 ~  n1 r! V# p5 ^
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
  v9 M' w! W% R6 O) w+ ?7 {4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将5 k6 C* x5 y  y9 q8 D3 e2 m
加速运行。2 q4 U/ ]9 t- y- c( h1 P( {
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:5 V' Q* m* k3 M& w) G$ W# O$ c
x = a.name; for k=1:10000, sin(A(k)), end;: h- e) R( e0 y4 o$ `& f  R! I
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
- j+ ?' ]# N( V! q度。
- L1 f4 Y3 ]5 h: I' w/ N# }7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低1 h' u% E  r. ]
运行速度。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
( |- }5 m  ?( R9 r/ |( }%%%%%%%%%%%%%%%%%%%%%%%6 z9 W7 L: W) s) |- Z1 w7 u- y
二、 遵守三条规则
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
3 Y3 H" t" M; P% r+ E3 b: A7 Bh means it is designed
for vector and matrix operations. You can often speed up your M-file c
- L2 n$ }: X% ^" node by using7 e% E) E$ \. i
vectorizing algorithms that take advantage of this design. Vectorizati, O+ Z. @% J8 z* y% J
on means converting! Q" `# d2 J% k" r* b. @# J/ _
for and while loops to equivalent vector or matrix operations.”。改进" [, _! E- P/ k' ?3 b
这样的状况有两种方法:
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
i=0;
( B+ _+ s0 D8 C8 _+ X1 Y  cfor t = 0:.01:10  X9 g9 [* P) W5 S
i = i+1;  ]( @. S. U1 A$ d' _: Y9 G6 c6 I( v
y(i) = sin(t);
8 a% U/ t8 {1 l9 w" z0 @* Y9 ^end( c7 L7 _, e$ u; K* o
替换为:2 e3 S2 I- ^4 a+ e0 a9 S  r
t = 0:.01:10;
8 r4 Z, N7 F8 Uy = sin(t);
. r) e$ I1 E& ]/ c. g, F速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
+ S* `7 m7 O* g6 J& Npermute、permute、
# \# s# q* n8 [# O3 r, V( _4 S' Dreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums, e+ o: }& G% w  l
um、ind2sub、
1 I1 N# _" K) e) j0 I' qndgrid、repmat、sort、sum 等。
请注意matlan文档中还有这样一句补充:“Before taking the time to
vectorize your code, read the section on Performance Acceleration./ i3 f7 w  o8 D  e
You may be able to
1 X3 v9 o3 U/ `4 u1 B. c) j3 vspeed up your program by just as much using the MATLAB JIT Accelera& C& s( Y6 d- V& y
tor instead of) v) z" q' ~( a$ T5 L9 C
vectorizing.”。何去何从,自己把握。
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执# ]9 R8 _- {% q$ u, z
行循环次数少的,+ }5 i% ]7 u3 Y: c+ J
内环执行循环次数多的。这样可以显著提高速度。
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
, E5 I8 m( l- `3 v5 p- mes、cell、struct、/ \$ h( M4 {4 X
repmat等。
7 Q9 s/ r) B% Q# h% q, nb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
A = int8(zeros(100));
4 L4 Q9 [9 R8 B换成:9 \4 \4 U5 i- F3 V: z* U' J/ W: F9 M
A = repmat(int8(0), 100, 100);
3 A* n; |8 K$ o% I% F% Xc、当需要扩充一个变量的大小、维数时使用repmat函数。
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
! D/ O1 R/ c$ y( r0 H: Q: Tb、使用Functions而不是Scripts 。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: Q4 j2 n  ^1 C8 Z/ @+ T%%%%%%%%%%%%%%%%%%%%%%%
& h9 k0 K& _, W4 s! }% ~" \三、 绝招
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。! q  F. e7 d6 ]9 Q: j
1、改用更有效的算法) X4 F/ j7 Y4 e! Y. o" S
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。- D0 W, V7 z2 E$ {
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧

- b4 @6 B3 U& u: b9 x$ Q/ g
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-5-24 00:47 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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