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

加速matlab运行的三重境界

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、 遵守PeRFormance Acceleration的规则
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
; n; U: ^, s" Y" l其规则总结如下7条:
6 f+ i' h% [  w( I5 w* B1 d1、只有使用以下数据类型,matlab才会对其加速:& R; J4 ^" O; F8 y9 Y7 H$ X, V
logical,char,int8,uint8,int16,uint16,int32,uint32,double6 K' \9 N$ t1 e" z+ }  z
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu4 f- j+ L9 E5 Y  ~5 v
re,single,
function handle,java classes,user classes,int64,uint641 m5 R/ Y: N/ }  G
2、matlab不会对超过三维的数组进行加速。8 C  R# b4 z! g. _
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
+ r; r3 \4 S/ [: K) o5 B$ r来表示;
+ M8 I5 W3 o  Y  I' ib、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
* ^  B1 X" ?. P; q% E7 A据类型,只使用# Z2 ?* d* o7 B; J; O& @- I
三维以下的数组;c、循环内只调用了内建函数(build-in function)。$ ^9 D2 u" e& g% v
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将0 \( d  U$ y7 P! C9 z3 o8 H' I3 \
加速运行。8 ?8 \, d1 K1 Q% `; k
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
4 V3 [# Y3 Q" @, o5 U( l/ a" \8 Lx = a.name; for k=1:10000, sin(A(k)), end;, {! [) s1 j! b1 u" T6 ~
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
- o+ H( c: e+ J; r度。
. C$ j- O3 Q4 o9 b1 t7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
1 c; u* m+ h! {4 \) g运行速度。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- j2 u& M0 y+ A5 Q' i' `. I; D%%%%%%%%%%%%%%%%%%%%%%%
# q7 t4 W+ E- \二、 遵守三条规则
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
; r( k3 ]+ e& A/ \h means it is designed
for vector and matrix operations. You can often speed up your M-file c
& y$ G( J% R% k/ n# Q' E- lode by using
0 R1 m0 v* L/ v$ A* t* Gvectorizing algorithms that take advantage of this design. Vectorizati* Z' V( b4 L5 n
on means converting3 }. a: l4 ^. y: J) V; C
for and while loops to equivalent vector or matrix operations.”。改进: L0 ^& A# [; N1 y1 N
这样的状况有两种方法:
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
i=0;( s# ?$ g# y+ U3 `" k
for t = 0:.01:10
9 _2 f3 J* q3 E( ]' A% C7 @& o' ui = i+1;9 M& N' {5 [) S+ A$ F
y(i) = sin(t);
; `1 O; m8 l6 V; d" uend% R9 g( a' k5 W7 X" t5 ^0 d
替换为:
1 N) ]" t7 Q. @t = 0:.01:10;
4 q# l9 E) _. g! }% `2 C( jy = sin(t);
0 Z6 V5 q$ t$ J; q8 n& K5 q速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
6 H) U/ Y- H+ Ypermute、permute、
( y5 N1 ^+ w/ r, f% G6 @reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums  L6 }. I) Y2 @4 y
um、ind2sub、
0 _$ o3 T  @6 hndgrid、repmat、sort、sum 等。
请注意matlan文档中还有这样一句补充:“Before taking the time to
vectorize your code, read the section on Performance Acceleration.
# }% O! f* j) r9 m& t% }0 sYou may be able to9 t6 O1 O# V8 D" j
speed up your program by just as much using the MATLAB JIT Accelera
9 U' p- ~2 [3 s: U: j! `8 \tor instead of
6 K) w" ?+ \6 ]8 X, A! mvectorizing.”。何去何从,自己把握。
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执3 f7 O4 \* Z$ ^8 E
行循环次数少的,
, c% w- F" X! i% W; |3 e* G内环执行循环次数多的。这样可以显著提高速度。
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
) b8 ^- E+ n, n8 b  P* Les、cell、struct、
4 O& g& L/ _# ~repmat等。
: \. q$ m+ L' `0 j! t& S# y6 Mb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
A = int8(zeros(100));8 O, e# M! W6 c( f# {9 ~
换成:
7 x: {2 u4 u& Y4 N0 mA = repmat(int8(0), 100, 100);
' p8 ?3 ?7 N6 r) i$ dc、当需要扩充一个变量的大小、维数时使用repmat函数。
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
5 V( O# _/ _1 q0 c* b3 Ob、使用Functions而不是Scripts 。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 w( l3 u4 ^- J! X3 H) Z' Q) n4 J' u
%%%%%%%%%%%%%%%%%%%%%%%
& l' ^( K7 ]. V三、 绝招
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。; \9 Q1 l/ \6 M
1、改用更有效的算法
) j+ w7 y( k6 D/ v; j2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。1 q$ n2 N. d; {; c: w0 F; r, Z
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧
7 j+ _& T! s- a7 m! |8 w! U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-3 06:16 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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