QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

跳转到指定楼层
1#
发表于 2004-12-21 11:00 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab * |% Q5 m1 |. h& P2 d" p$ L: g标 题: 加速matlab运行的三重境界 / `# W5 q* X1 x8 [+ `0 b# ]发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004), G8 ]' F/ o* O4 Z8 J/ _ & g; W, ~% P. c加速matlab运行的三重境界

3 ]7 o/ S% o: E " Y; v. a, V6 W+ R, ^8 e

一、 遵守Performance Acceleration的规则$ P8 b+ o) t b1 R% W- T , }! N# s+ w4 r3 t3 J( \关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将9 H" o X3 s E6 x4 _: K+ p 其规则总结如下7条:& d9 u$ S3 `8 x5 F2 @' ^ 1、只有使用以下数据类型,matlab才会对其加速: 5 Z& T/ S4 l& d/ p9 ~2 w5 t$ clogical,char,int8,uint8,int16,uint16,int32,uint32,double , N0 U& q8 `& }. j' o而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu + t; d) @4 [- u: I. tre,single, . t7 _7 z" a- G! Y F2 j9 u + W; _3 h8 e0 _- j# p2 L' [function handle,java classes,user classes,int64,uint64 : D& w& o0 V7 }. H! r8 b1 d2、matlab不会对超过三维的数组进行加速。 1 x5 G* I) J& |9 f. _! P3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 / L" k8 T( ] o; j来表示; * k/ ?: v) t1 j# \0 \b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数1 z' H/ \. o, L7 z E8 }0 J1 Q; | 据类型,只使用 9 B% d6 w: h& }7 D0 \三维以下的数组;c、循环内只调用了内建函数(build-in function)。 3 A& l& n& Z- Z# i4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将( |; F: o0 x1 }" K2 E- T3 ^5 ~/ h 加速运行。: x4 v& T$ F3 h3 w' O; |" K( Y9 g 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:# p. b8 h: Q0 o: Y: Z0 F x = a.name; for k=1:10000, sin(A(k)), end; . h: a4 ~0 S' p9 h6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速: x3 B+ E1 w' c/ [2 S3 D! R0 N( o 度。 % f# i& I7 m2 h' N* Y7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低7 k5 f, n6 o& I3 I/ h 运行速度。 9 }! d3 j1 p2 v/ R/ p7 R9 l/ Z0 J

, W- L( ~, E# S; @

二、 遵守三条规则: F- h. Q; k& d) r8 g0 X # {% X7 ~7 ^6 V* K 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic. D0 c+ B/ k: T h means it is designed, @6 A5 O2 s2 ?- J$ ?5 ^3 m , o7 M. N# C/ \! A6 g for vector and matrix operations. You can often speed up your M-file c * }" a. v, y% M- Zode by using4 T3 [; i# _" h9 T/ X vectorizing algorithms that take advantage of this design. Vectorizati) p( A0 G0 U8 }/ L# t' _ on means converting" d; t/ k1 A; c6 Y! @4 G+ H for and while loops to equivalent vector or matrix operations.”。改进 4 H Y: @) S- c4 {) s+ _. ]% \7 l这样的状况有两种方法:$ ~; I3 z3 B4 j( t: B. t $ p/ n% q3 C4 [. Ya、尽量用向量化的运算来代替循环操作。如将下面的程序: ; I9 N* e4 z4 p0 k! k * G+ G' r p* Y( {- ?i=0; / t* Z5 {' L1 O* e7 l0 @for t = 0:.01:10 5 K0 ]- p+ Q1 b- @2 {0 Xi = i+1; & W1 t2 U- K; R6 }7 C0 fy(i) = sin(t);/ w" W5 X/ M4 B/ E8 R" Z end$ O1 k7 }8 X# @, u# w2 V2 I 替换为:8 Y0 S1 h. w. s" o M2 h t = 0:.01:10;. }$ C' w; o3 m, H) j y = sin(t); " y9 [# d9 S& `6 q! x速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i/ ]9 X) q2 ~# { permute、permute、 1 M1 ]8 w5 N: j, a! Breshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums/ ?+ \/ {! A' a% P y9 H( G um、ind2sub、3 A! M/ X- d# n& `4 j( L6 m0 B$ O ndgrid、repmat、sort、sum 等。. R) H" \' t3 ] : } o2 J# t" i8 d; z请注意matlan文档中还有这样一句补充:“Before taking the time to ; u+ j( B% k' E8 S6 \! P+ c6 u6 }- m3 o# T3 Z vectorize your code, read the section on Performance Acceleration. : f" c* D! ], }# R9 t8 RYou may be able to3 A. y' ^6 V6 b$ |$ _6 V speed up your program by just as much using the MATLAB JIT Accelera; }$ S6 _% j# O8 } tor instead of . x" f \4 G4 f" rvectorizing.”。何去何从,自己把握。 9 Z# P1 H' m h6 v+ R0 E3 y- [" Y( @3 i b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执& I5 S* C: h5 o0 U' [% q: m& X7 g 行循环次数少的, # |: B4 k0 Y7 d( `. F内环执行循环次数多的。这样可以显著提高速度。: v T x; _7 f0 O! F# R 8 Q0 K3 m" V4 e% M# z 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on* Z6 B2 p' U" l) u2 ?4 C, A) b es、cell、struct、 ! t2 L0 ?- r' O, v* H3 Vrepmat等。 * M4 } n M# F5 S cb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 y' F3 I# m; ?! w: X4 ], @* B ; @4 ^$ ~) e) Q3 b$ GA = int8(zeros(100)); 7 b& ~% D5 E2 e换成:9 {9 I+ f2 E7 M A = repmat(int8(0), 100, 100); + c' Z/ `7 Z1 L/ kc、当需要扩充一个变量的大小、维数时使用repmat函数。 : ?7 d1 u! f+ G2 r) K: w5 o. P4 r - C( H* x" w3 k3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。5 Z8 @7 K4 ]7 b, O* ^5 A+ Q b、使用Functions而不是Scripts 。& F7 U$ A& ]0 T c6 @% R0 R: R

/ q" m; j* c" E; G2 \3 Y, l

三、 绝招 # C( I4 S0 _8 O) o$ E% y 2 Y3 \) N( r& T# L你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 2 c( ^% u# D" B% A. r0 @: n7 U1、改用更有效的算法% z: O2 E) A! A' [" a( i* W- y 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 0 G9 A+ C6 |7 H+ `$ x g' g0 F5 M- L0 P& c关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ $ U; M: ~; x+ z% S. t+ S: m+ y( S语言文件,VC编译”。

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

fup        

0

主题

2

听众

43

积分

升级  40%

该用户从未签到

新人进步奖

回复

使用道具 举报

ornewuser        

0

主题

2

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

注意

" S. h& u: B$ \# Z

加速之前应该先测试 & d5 s$ k! t+ k/ S( ]% B使用profiler可以获得程序各个部分的耗时 ) W/ h5 u# `" E B" ?如此就能高效的加速 J6 u7 m+ _) {! ~& x3 v) Q

# z/ F/ Z, e* y1 _+ x3 V% c

因为有的时候导致速度变慢的原因是逻辑结构不合理, % _$ p2 Z) H" W. O; Q' J而不涉及程序技术

! u6 u+ h+ v, `. p+ ]( l

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

布赖        

4

主题

2

听众

134

积分

升级  17%

该用户从未签到

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

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

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

蒙公网安备 15010502000194号

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

GMT+8, 2026-9-12 10:22 , Processed in 1.078781 second(s), 91 queries .

回顶部