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

加速matlab运行的三重境界

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、 遵守PeRFormance Acceleration的规则
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
/ ~1 N8 q& }1 B) ]" t, q# Z3 s其规则总结如下7条:6 s. N% P5 M+ b
1、只有使用以下数据类型,matlab才会对其加速:
' q8 `; D, K7 N# \logical,char,int8,uint8,int16,uint16,int32,uint32,double  X- g. O  Y& a
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu5 R. \  Y, h) ^$ x
re,single,
function handle,java classes,user classes,int64,uint64( a; \- a' {$ Y" V6 R' K' {, O# [
2、matlab不会对超过三维的数组进行加速。1 M" H! N4 r8 U9 V0 l" v- V
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
0 R9 E% h" n$ Z来表示;
+ G5 c* j% @+ Z4 T3 t0 `- c6 ab、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
0 k7 W2 k3 k$ l8 i, e据类型,只使用( W" c. v+ F; [) y" P, x* x: v2 z8 ?
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
1 L5 `2 v) {( ]+ Q% E3 L, m- @4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
* ~1 g) U* O" u& {% ]加速运行。
! h* [) ^& X* N$ i' K5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:$ ^: x; {: h/ _' ?6 }
x = a.name; for k=1:10000, sin(A(k)), end;
9 F* L5 G4 y- _6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速' K& L/ J" X/ |  w' r
度。
8 u$ ~" M& c% K* R# w) Y; `7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
! b1 Q) L! B# a& l运行速度。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ w$ K8 \1 l' _/ F& j! o%%%%%%%%%%%%%%%%%%%%%%%& C7 u# @- ]! t8 u, T( S
二、 遵守三条规则
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic+ U3 `8 P1 b( P  Y6 C: b% m
h means it is designed
for vector and matrix operations. You can often speed up your M-file c
! o4 v$ K$ P5 T/ b2 code by using
1 u* U" C& _8 M) ~vectorizing algorithms that take advantage of this design. Vectorizati, K- P3 p0 k6 `+ Y2 [
on means converting# ~% t% ]$ h# ]; A+ I0 B: p
for and while loops to equivalent vector or matrix operations.”。改进
! Z/ n/ h2 a/ T6 S这样的状况有两种方法:
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
i=0;; T( ^0 H& k, J
for t = 0:.01:106 D4 o! y3 s3 p) P5 i
i = i+1;- e1 x9 z2 g8 R5 n6 q
y(i) = sin(t);
) A2 @% w8 y1 Jend
% Z4 q0 i8 b2 x. L' D5 T$ v替换为:
2 \3 l! G" O. ]" n' Lt = 0:.01:10;  n  D4 F0 E7 l
y = sin(t);3 U/ A9 l3 W" A- i  S" z/ n
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i5 @5 @, G9 Z2 `( C$ ^1 J9 v
permute、permute、
! P( _$ Q0 ?% kreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums+ r5 [) r7 V& t, U1 L6 ?
um、ind2sub、
2 ^& I; f8 J% [) T+ j5 R1 u5 vndgrid、repmat、sort、sum 等。
请注意matlan文档中还有这样一句补充:“Before taking the time to
vectorize your code, read the section on Performance Acceleration.
  C: }+ H& m  G3 o7 V0 iYou may be able to& v! J5 }: v4 `& X/ ]  y
speed up your program by just as much using the MATLAB JIT Accelera
3 b1 d/ q: R% g7 e& s9 @$ ]tor instead of
7 Q) ]; U( r& ~! \) N# S% Qvectorizing.”。何去何从,自己把握。
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执5 P' H" }5 j4 S
行循环次数少的,
% _; |8 H7 }6 k) [内环执行循环次数多的。这样可以显著提高速度。
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on) w: Y, j8 Z5 F) J2 y$ g& L
es、cell、struct、% a: [2 x3 u# k* B' W6 x- A8 D
repmat等。
; ~: A. u5 N/ N) m: tb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
A = int8(zeros(100));$ O6 o3 R2 j+ ^8 O& [4 }
换成:
, }5 F% C2 h! wA = repmat(int8(0), 100, 100);! e  G- t  w1 x  T; k- X
c、当需要扩充一个变量的大小、维数时使用repmat函数。
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
' @  r4 |( v6 ]b、使用Functions而不是Scripts 。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 Z( n  {9 h% U( C# |%%%%%%%%%%%%%%%%%%%%%%%
, o+ X" r! T# O6 A, R0 {三、 绝招
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。/ w: ^0 X% K/ r1 {3 ^! h  D# v
1、改用更有效的算法
0 X% L8 ^( |; s) ?$ f2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。& D0 W6 Q, R$ Q9 e
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧

7 U9 {3 o' \4 q2 c" e+ M4 G, }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 01:26 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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