QQ登录

只需要一步,快速开始

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

[转帖]加速matlab运行的三重境界

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-1-20 10:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
信人: fork (撒哈拉沙漠的沙), 信区: Matlab, p% X! U# i8 X- b2 L- b
标 题: 加速matlab运行的三重境界1 s+ |% a- X! M3 ?
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
' K1 ?4 n9 k. d. }" f0 u+ ]4 |' S4 b1 P+ A; f- H1 b
加速matlab运行的三重境界
+ c3 \! f5 v1 J7 [* E4 F2 \3 T2 z& A1 r2 y& [/ K, h' l( d. f
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/ c1 {/ I7 P7 s7 `  [%%%%%%%%%%%%%%%%%%%%%%%. {' L" H2 t. C, a
一、 遵守Performance Acceleration的规则* K& ~- D3 K. e- T5 H) u
二、 遵守三条规则
7 x6 p+ ]0 K5 N% x# T三、 绝招: d% G" ^5 q9 V- ~1 j7 I
7 y+ c/ ~7 W$ x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$ |+ O. I2 W! `; r%%%%%%%%%%%%%%%%%%%%%%%
5 L$ G" H* ~$ s一、 遵守Performance Acceleration的规则
3 v' ]" U1 K  w' j* a$ Z6 S6 B9 k( h0 }( l6 [
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将1 Z& @  d3 b8 v# X4 ~* a1 P( e" E
其规则总结如下7条:; z1 O% r, n1 R. E$ R" C
1、只有使用以下数据类型,matlab才会对其加速:
) t+ P* f7 A1 Y3 j/ Plogical,char,int8,uint8,int16,uint16,int32,uint32,double8 {- v1 y! ^. d# Z, u4 A
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
0 e+ [8 b. J$ L0 q3 zre,single,4 L8 v, u- Y$ B+ \. l' A

4 m# {, o7 ?% O) \3 _. h0 |function handle,java classes,user classes,int64,uint64
# I6 D$ K3 l9 U! s1 S2、matlab不会对超过三维的数组进行加速。
: P" F+ r) @, ?& z7 m4 ?5 u9 N, K3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值* B! b+ j& W% Y: e
来表示;
7 U9 g" e0 r1 K6 K8 ^! qb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数; `  L: ]/ g& G9 I
据类型,只使用5 f1 Q+ [, `* _, ?& C' v/ ]% V7 L
三维以下的数组;c、循环内只调用了内建函数(build-in function)。# A0 e' ~9 G: T6 e; p8 ~, W
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将* h- v6 t8 k; [
加速运行。
+ B! M- D/ c' _8 ?6 S5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
, O% S  ~2 X* z! wx = a.name; for k=1:10000, sin(A(k)), end;
6 b  O4 M# p: ~4 {6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
, f; c  p- Q! w4 b3 o度。
( y+ {6 X9 b4 r7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
: ?8 M) R; J- e  h; `运行速度。# w$ j, X( H4 B; G4 A9 j

& U& w4 V+ J* e) i8 `%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0 S: V7 A- H! x- ?. a9 ^" b) N%%%%%%%%%%%%%%%%%%%%%%%. ], Q9 u: u$ T% Z* Q( E1 x
二、 遵守三条规则
- W5 l6 u, R; E- n' f7 P- Y& u# d0 p7 c3 x8 p- W4 Z: B
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
* c( m( F! U, L3 o) j+ f! _: K1 Zh means it is designed  j' Z$ Q% ~! ~. D# g
9 V5 \# A' a6 s
for vector and matrix operations. You can often speed up your M-file c0 y" i: ^. d3 B% W# S
ode by using
% ^4 _5 `/ T( A' P/ }5 W) lvectorizing algorithms that take advantage of this design. Vectorizati
- [# v. ]! z1 }' U. d3 W) Non means converting
+ N( J# Y0 H3 s- ?for and while loops to equivalent vector or matrix operations.”。改进
' t& {; ^5 {- z4 I0 e9 x这样的状况有两种方法:9 ]. H( w! ]  d. u. F

/ q$ Y3 m9 x' |& N  l8 ya、尽量用向量化的运算来代替循环操作。如将下面的程序:
. c: Z6 X- h6 @- s2 F
( r6 o% ^1 P1 }i=0;  e' b( @! h$ v. p
for t = 0:.01:10
& ?, p9 k! g; a, a, Ei = i+1;
1 W" w7 x3 K8 g  `y(i) = sin(t);
. F# H" n4 l4 H' I4 F9 send
0 I, `( E$ G9 B% `0 N* u* q替换为:, k3 \" {7 |5 a$ _+ ~" o
t = 0:.01:10;; h) p5 s) Y  }4 b* m9 T* }  g
y = sin(t);
. S2 E; |) q+ u速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
4 \9 ]. o. s* D1 @6 Ppermute、permute、
" F8 g/ t' I2 u5 T5 ?reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums% \# ?2 V3 g* S& J' W* S$ i
um、ind2sub、
5 u/ @  g6 w4 |ndgrid、repmat、sort、sum 等。- `& z" F! v" o  b$ y8 _

" w/ X% L8 n5 b- ]3 b1 C0 E请注意matlan文档中还有这样一句补充:“Before taking the time to0 Z3 Q0 Z# q/ B2 x  ]6 S
" w% D, q: f$ T  k/ K+ D$ `
vectorize your code, read the section on Performance Acceleration.5 [+ U% l/ L3 p! D4 `( Y, m0 V) f
You may be able to
+ Q8 X& H5 \; _) g6 x/ Yspeed up your program by just as much using the MATLAB JIT Accelera
) N( W4 I2 l0 H5 D9 V. n5 I- Ytor instead of% @. ~4 N* z0 T$ ^. X2 G3 @
vectorizing.”。何去何从,自己把握。/ {+ P% u* B) X. a9 f

& y9 t6 q$ x; c  M( }! N/ P- P) Eb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
$ v% C' U; U6 u. \' q行循环次数少的,1 ]6 w- Q* k$ q3 S
内环执行循环次数多的。这样可以显著提高速度。0 u2 ~' a7 l% |. [8 o! }3 C2 q
- S0 y; {; [7 x( T8 r6 z8 I  J
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
; W, L. r( t& d$ Des、cell、struct、
  F8 m' R( u/ n6 r; l) ~0 c$ xrepmat等。
- G; [4 j# ?, }/ jb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:: D5 C. r% g: D3 m3 t, m4 a# @

( D/ v$ W$ ^. r, IA = int8(zeros(100));
2 j  L/ s4 G0 P' o: w# t+ [) L5 ?换成:0 ]0 x( r3 p% `4 E. Z: i
A = repmat(int8(0), 100, 100);
5 C2 O' n6 B- M: m& h: m- Qc、当需要扩充一个变量的大小、维数时使用repmat函数。: g5 h& K# X- a& c1 E5 C1 g
- S2 v. U( J7 X4 ~) O7 H  t
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。. \  m0 G* H9 A# [, t
b、使用Functions而不是Scripts 。9 w+ A: Q8 l5 v1 F
( W6 u; e7 `5 s) r7 ?; V
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 d, D4 V  O  |% B+ }- K+ \. n/ o8 e%%%%%%%%%%%%%%%%%%%%%%%
. L" K0 q& M% }8 r5 h1 _三、 绝招
5 g, x* d: y9 ?) c6 M1 T2 |& O9 g2 `* G. ?
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。9 E$ s0 ^2 e! }. o' F1 [
1、改用更有效的算法
" C1 J5 P! H# z+ i7 V' U0 w! J2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
  m/ G$ H8 \# V) S, J
6 \9 e$ s) V* R6 M0 p! u+ |$ v关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
, a/ w8 \' Y1 I9 R" b语言文件,VC编译
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-10 20:24 , Processed in 0.457799 second(s), 52 queries .

回顶部