QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-1-20 10:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
信人: fork (撒哈拉沙漠的沙), 信区: Matlab) o+ L. e* `7 g0 Z6 ^$ a# C& ]
标 题: 加速matlab运行的三重境界
3 I) E6 x. f+ P0 I发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)# s2 J+ G$ J' N* T3 h

: B8 ]( j) K/ S# }1 l加速matlab运行的三重境界
3 k) W0 }2 K0 S4 T9 ?9 m
. n6 P9 D. z' `; M3 v, V%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0 X6 z) d/ e% n# e. J%%%%%%%%%%%%%%%%%%%%%%%% E0 Y+ |+ c# J& P0 T
一、 遵守Performance Acceleration的规则8 `8 J  S/ u3 L
二、 遵守三条规则
& K& n$ \, h$ H; R. n; \9 w三、 绝招
0 G, g/ w4 @( f: s; D8 Q  S$ k- h. q( C  D. D) l. ~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ z/ l+ Z( @/ R6 Y
%%%%%%%%%%%%%%%%%%%%%%%8 ?4 U# t- U) v! u
一、 遵守Performance Acceleration的规则! J) Q2 F1 t* c' G# R/ \# B
  K$ L: y% y' S2 Y1 D9 w
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# x' ?  i+ Y" ?6 k" \0 S
其规则总结如下7条:* G6 p0 {* B! o$ Y8 N
1、只有使用以下数据类型,matlab才会对其加速:
8 z; q+ j0 D7 ^4 ^' I" Blogical,char,int8,uint8,int16,uint16,int32,uint32,double! ~. D% }- f. B2 x
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
" f0 @# q6 `; f* O5 Z" [6 qre,single,
% U7 B. \5 ~  n, W" f* B) S, g# g4 ]9 k: }4 l; \0 }
function handle,java classes,user classes,int64,uint64( U; N9 r; O$ B  f2 T. L
2、matlab不会对超过三维的数组进行加速。
, b. {, l* ^& C9 L" p4 v3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
4 s( t; R% o1 u$ @; l$ q来表示;
  o) p9 e3 @  `- T+ J. p+ u: w0 nb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数  T: @6 a/ f' Z5 a7 }, @
据类型,只使用
& M# d' ^- x- b/ p三维以下的数组;c、循环内只调用了内建函数(build-in function)。
; }8 N$ c- ^  z9 S' \5 O4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
2 ~# Z. S( t; R" j加速运行。7 n1 @) p) T: m( D" ?
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:. K/ H9 F2 K4 f- C/ B
x = a.name; for k=1:10000, sin(A(k)), end;$ W8 M7 T/ t& C1 J8 \7 [
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
7 A+ P0 `+ \" N# K9 b) T& ?) D度。
/ L8 i  l, E6 j5 P- s- Q7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低3 _( u- L  S+ X' Y3 \+ ~
运行速度。! i4 F7 p2 i7 ~

$ {. O* U$ D) {& B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 E2 H$ Z! |+ P) K
%%%%%%%%%%%%%%%%%%%%%%%
; }' D' L" x" v  s# |) J二、 遵守三条规则
0 }2 Y$ o7 W- H9 ]
8 D4 O  s- w  P3 y# ]% e$ z5 S3 C/ n1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
0 {. O6 d2 N/ q- P+ B+ s" Wh means it is designed
  j5 x/ }( w' c5 `, z( @9 d3 s) v
for vector and matrix operations. You can often speed up your M-file c$ D9 J3 q: @- Q, `
ode by using& e/ x! H: g5 \, Q/ G3 r
vectorizing algorithms that take advantage of this design. Vectorizati& Q) s) Q! b! X# w  v
on means converting+ s( c2 a6 t. _% F) r2 F
for and while loops to equivalent vector or matrix operations.”。改进; c8 ]% Z  G% D2 p- a" l7 q- E
这样的状况有两种方法:$ Y5 s. V: ~4 I5 L7 l- l; K, ?

" O' a! G+ B+ B. Q* h5 ta、尽量用向量化的运算来代替循环操作。如将下面的程序:
/ t0 t8 B+ ?% {+ m8 r) D) ~; y. ?# \* G% M
i=0;6 m- U, J, Y( n6 d* n4 o
for t = 0:.01:10
  \. A7 h0 w: X, D( li = i+1;
5 X/ y: |. {3 |y(i) = sin(t);
' w6 c6 C! C' G9 Dend
6 e# M6 E+ E+ k& N* k4 s9 u替换为:8 u/ t  B% i8 N
t = 0:.01:10;5 z: Z# @5 s: _) f" e  u
y = sin(t);
' s% p/ _  D% m速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
  [; |0 W9 V0 d( B' o- Ppermute、permute、
  k' t) K, V. _6 C& K0 I- g+ freshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
5 D9 @" i1 n" O6 H/ f& @, @# I- X: eum、ind2sub、2 P. H1 b- Z- p1 Z7 J. O
ndgrid、repmat、sort、sum 等。
) S- E0 v& w& V6 V4 r% \$ I
$ Z4 @! e2 k; j/ ^7 L7 C请注意matlan文档中还有这样一句补充:“Before taking the time to2 k7 U) [7 q- a: }4 A

: r6 _% o0 v5 m8 b4 S* _vectorize your code, read the section on Performance Acceleration.' c* _; ]6 O. j& q2 S" I; e
You may be able to( [2 H% x8 {6 i+ j! L8 M9 i8 `
speed up your program by just as much using the MATLAB JIT Accelera
7 `4 X5 J* j# ^8 C7 O! g' ktor instead of0 G8 ^, \, u1 ~
vectorizing.”。何去何从,自己把握。
# O4 x5 E2 Z, X- a
% d( Y7 Q; [+ B" _# q: j) Ib、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执2 X5 |7 B" [+ v7 G, h' Z, }9 T
行循环次数少的,
- b  T: d1 \& ^$ Z内环执行循环次数多的。这样可以显著提高速度。+ Z7 u# K; ~% J0 J3 J5 \4 y7 o

# g: ?/ p2 f; t  W( h" E+ `2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
0 i1 P; t/ R3 D( V: u" Mes、cell、struct、. {/ z0 m% y" m: J0 `. h$ j! }" J
repmat等。
: E9 R& y/ O0 v" }. N3 Zb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:( k. o, J4 U$ R; y/ o

2 f7 @# Q3 r. G3 t& m4 B3 ZA = int8(zeros(100));9 e5 A; |# w8 E( v" e
换成:  A2 T, Q* c" r
A = repmat(int8(0), 100, 100);9 s2 c7 S6 J. z1 ~. S3 p4 j. y1 f
c、当需要扩充一个变量的大小、维数时使用repmat函数。/ }7 F* x6 [, w2 `4 [( p7 ^, @, f. j

1 r5 T1 i& i. t4 F4 \$ n9 M3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。: ?- H; b" j( y/ d1 p7 X4 e, g
b、使用Functions而不是Scripts 。
8 O& Q* x7 `$ Q- S. c( f; L# M- D
4 T2 x6 N) p: z3 g, D1 l%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' X  m" X; S7 e' `%%%%%%%%%%%%%%%%%%%%%%%
: ?& o- [+ d5 s2 G2 y, Y* f三、 绝招1 x6 R% Z6 f3 A" i9 L) M

) _0 C% d) C7 K2 e0 y4 @你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。2 _  J" d# s6 Z1 a9 O* Y
1、改用更有效的算法. ?; P$ v2 C- @( I* n9 A
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。/ k" d, p/ `% w9 d  _% K

: u3 f  {& C, ~) }1 p3 x/ h# U关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
, x( T7 C' _7 @  M$ `/ F% h语言文件,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 08:39 , Processed in 0.321272 second(s), 52 queries .

回顶部