QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-1-20 10:27 |只看该作者 |正序浏览
|招呼Ta 关注Ta
信人: fork (撒哈拉沙漠的沙), 信区: Matlab
2 a; S9 v7 p- B' u5 s+ u* a; A标 题: 加速matlab运行的三重境界
- v- r; X0 f$ n9 M: u/ r, H发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)3 h3 O6 E, Z. R( B+ ?6 R; r. a; m

/ r/ n; \% `/ `# u8 g加速matlab运行的三重境界
6 A, I* _! N4 X" I0 B2 S
, z$ p! D: u, B* t5 P# A/ A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ~6 K! Z* E; Y8 ^% q4 a3 i
%%%%%%%%%%%%%%%%%%%%%%%
# W% L# N( v( C3 p& {5 ~* |. W& X一、 遵守Performance Acceleration的规则* s! X8 ^# L7 f) V% D
二、 遵守三条规则
, [) O0 a# m+ Y! q三、 绝招7 a* A% B5 {; p: y% ]" c) I

5 ~, D% w2 G% e4 G& I9 G: c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# `1 i3 m: g$ B8 ]2 ^6 D8 n3 @%%%%%%%%%%%%%%%%%%%%%%%
2 p4 M* D  P9 r9 M% ^' Q一、 遵守Performance Acceleration的规则2 v6 n+ N# @6 H& o0 g- s
1 Q4 l) Y* M- ?* i; ~
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
: D! T2 q/ y& C( b- Y3 n其规则总结如下7条:
, B$ S% U; K  g" p5 }1、只有使用以下数据类型,matlab才会对其加速:+ N7 Y) i/ b0 M" D) \
logical,char,int8,uint8,int16,uint16,int32,uint32,double
, P9 P7 t2 n  [" L4 f而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu8 L* b4 y% J% d: {4 c7 b  F
re,single,2 D# G. U( q" I  ?, W7 ?2 o  m5 g

5 [  g8 E: Q7 I, w) d* A/ Afunction handle,java classes,user classes,int64,uint64& ]* ?5 o! t6 p
2、matlab不会对超过三维的数组进行加速。
* G  }4 b. `4 u! E1 e3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值2 z6 q" G  G7 K: T( G4 G* M
来表示;
1 P+ o7 ?1 z" S+ e0 zb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
2 ?; Y- J/ ?- q- T# M; b' b据类型,只使用
9 y4 J0 H6 {- A" G" f8 V" N. C% i三维以下的数组;c、循环内只调用了内建函数(build-in function)。
  R; l- D" g$ D# J3 U1 U, o/ u4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将5 o1 R3 |3 y5 _; c# a% r7 f
加速运行。: n& g  L9 F; t
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
& D' L% ~. @; C% v- S$ e0 m3 Px = a.name; for k=1:10000, sin(A(k)), end;' T( P/ _; M0 s9 ^* G( w
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速  c  Y& k# {! ~% C1 t$ L$ q: S! u5 J
度。
. [! T! z( I$ r5 b2 x! @6 t7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
+ I' r. j, v/ O, m( D( |运行速度。
' i' n# f" ^0 y) t7 e& I" \* c4 e0 l8 l+ V
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 ?, t) ?4 r4 g: r# h; F%%%%%%%%%%%%%%%%%%%%%%%8 |, ?  i4 d- q
二、 遵守三条规则2 x4 F( l1 c- D* R0 b! Q* L- M* W

7 e5 Z0 j( v8 @0 q7 x* @$ t/ W; ~1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic0 O. e, t. k# E' k& \. L
h means it is designed
/ H6 |7 N3 M3 l$ w
' w0 |: h6 Y6 m% X, Jfor vector and matrix operations. You can often speed up your M-file c6 T" S7 x1 T9 b4 {* }5 \$ J
ode by using
, {, y( p" h) P" X+ Cvectorizing algorithms that take advantage of this design. Vectorizati8 A: r$ L' q* R, m0 {3 L
on means converting' n+ N* z8 v6 R# ?* l* a3 b  |
for and while loops to equivalent vector or matrix operations.”。改进2 k: p% ]% t9 x7 ?2 t3 Q; b( s* F
这样的状况有两种方法:
) M$ c+ }$ v+ |* ]: I* D/ r0 W3 F) R: M
a、尽量用向量化的运算来代替循环操作。如将下面的程序:+ `% P' U" L# C  q4 a; I
2 ^# v( h% Z2 y1 P7 B' k
i=0;
1 A; p# h# i9 N' @; ?for t = 0:.01:106 w! S2 s; U' r
i = i+1;/ g3 H& j( M7 Q. Z2 b( W
y(i) = sin(t);
4 j) m4 J4 d) f3 q! e8 t1 K9 [end3 r' `! s: v2 R) A8 m; V9 ?! l
替换为:, t/ u  T8 i. j! Z  r
t = 0:.01:10;
3 G6 `# }  S) D( G% |y = sin(t);
# `& F( L) G( n: _' @速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
, _- _# }- m7 K" }+ \) [! Dpermute、permute、* K5 p+ W& F) S- e
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
9 t% ~. }4 O- J5 E+ P5 }# zum、ind2sub、3 L+ z' w2 E) y' E; @& o, N
ndgrid、repmat、sort、sum 等。% m7 `, c# G6 f5 r# o4 \
& I- B- W" r4 X9 ~! c) X
请注意matlan文档中还有这样一句补充:“Before taking the time to
8 Z2 P# O+ A6 s# a! J$ U0 c0 ?
2 I$ k  Q3 w" }0 U) nvectorize your code, read the section on Performance Acceleration.
9 U, b' I" |' H) ^5 y5 l- SYou may be able to7 j% R6 D5 e; r2 O- O7 V, t
speed up your program by just as much using the MATLAB JIT Accelera2 N* Z6 k. S, Z0 P* _7 A6 \% r
tor instead of! Q8 p4 H: q2 I2 l& S
vectorizing.”。何去何从,自己把握。2 y6 U$ a! J: T
/ @) G+ l5 s, j7 B* Q; A8 v
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
  h% P* P$ t5 h. B- T' s( `" V$ z行循环次数少的,* Z6 \9 x: }; V$ d8 c' c
内环执行循环次数多的。这样可以显著提高速度。/ O6 g( P4 {- K3 U$ D9 T
' ?5 z; G& \* T5 E
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on  u. N7 o; {, m* B. \# T
es、cell、struct、3 q9 n+ c" S4 q7 S  {! Q6 M
repmat等。
8 h  Y% ~2 r: Ab、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 P7 p7 f" Q0 n% |
6 G0 y3 c  K9 g9 H/ z. y
A = int8(zeros(100));
; z8 V* G- r# o) u! d换成:
/ h# X- Y' S" D$ s. I( {A = repmat(int8(0), 100, 100);
" D  a, y" v# kc、当需要扩充一个变量的大小、维数时使用repmat函数。9 |, F  c& H: x$ g' A

4 L" ~0 _. a5 h# {  ]3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
$ Y, Y1 W. u5 r& b: ab、使用Functions而不是Scripts 。( k* a0 I1 y% z$ p8 v; E

* x' E2 F- Q0 [4 R) k%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* I5 z5 P# w" n9 c! L! [%%%%%%%%%%%%%%%%%%%%%%%% H' f9 }- G7 w
三、 绝招
6 B/ c4 Y9 f; |) W/ s
2 _+ f" k" h2 d- c4 v  S你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
. _; C; Z! y+ x1、改用更有效的算法- k* F! G% J! z- r3 z
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。4 h% ]% m# E0 @8 V
" d2 V( r( Z6 Z
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++; {; K: m9 e- K* }, ~
语言文件,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-5-26 21:01 , Processed in 0.413192 second(s), 52 queries .

回顶部