QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab ! c7 E- q8 T- @, s5 c t标 题: 加速matlab运行的三重境界 l* a% g) \9 F0 Z' t 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) ( g: M# b6 a; K0 `: k& P , g t5 A' I2 b6 C6 _加速matlab运行的三重境界

* ]/ `7 n& h9 b2 X/ p% j5 D- q# ]4 u- Y( v

一、 遵守Performance Acceleration的规则 ( Y7 b- F( r% x) }( F4 k+ i! ^9 b! u- m; n; [4 e 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 4 v3 x) z; G3 L% C' d; w其规则总结如下7条:; D. Z- r! m4 O 1、只有使用以下数据类型,matlab才会对其加速:; ~5 {2 A, |0 A1 N$ C logical,char,int8,uint8,int16,uint16,int32,uint32,double 7 }+ r, g7 C: s3 h+ q: _而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu ) p% A) g0 O. Z4 b. x5 F" T5 Are,single, 6 D$ r$ R2 z9 p" i0 O" d; R, ~) s$ D P8 ~0 F function handle,java classes,user classes,int64,uint64 ]$ D( P* Y+ i. v# i( |5 m 2、matlab不会对超过三维的数组进行加速。" _* L6 D$ D, ` 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值. q# u0 j% a- D/ V7 ]6 q9 \ 来表示; : ?" p, c# A2 c$ h2 g9 G- {* Z0 [b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数& V& M- {$ Y+ E0 x 据类型,只使用 ! J" [# g+ M9 [: c' V/ K三维以下的数组;c、循环内只调用了内建函数(build-in function)。 * g ~( o( J8 B, C6 _6 o4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 4 I w* ~; h& l S8 J' @3 k; o$ K加速运行。 ; G5 f5 J: N; E% y* @5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: - o6 S' }' `' L1 ^! e# v! `x = a.name; for k=1:10000, sin(A(k)), end;! L8 `: A( r$ ^$ u, K9 \& f) a" S 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速# @; y M0 P. J6 `5 k# R* E 度。 R- q% v* @$ Z4 @7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低$ e) G$ f/ a$ R2 K% V/ | 运行速度。 7 b8 b& J, L1 H( a; c( k# `' ^

5 t( i6 ?( \; M8 M! z+ k9 b; K

二、 遵守三条规则 $ B6 s* J. p0 `/ v, I* |+ {- v E# W* M1 J 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 8 o: M+ r9 U! ^) y0 I7 }* c, ?( @h means it is designed7 e3 p" W0 u# ^# T4 { & u; ]. h$ r+ a; E# D1 Wfor vector and matrix operations. You can often speed up your M-file c+ X9 L6 x% h( X ode by using 7 U, b+ C q1 f, _; J. j gvectorizing algorithms that take advantage of this design. Vectorizati 2 u5 v& N/ }! v. K% T) \: s- eon means converting8 L. L6 S2 U" t7 c: r5 c for and while loops to equivalent vector or matrix operations.”。改进8 H7 f8 X/ l. b( C$ b 这样的状况有两种方法:8 I5 y- X; @& p* m5 R% b - K: X1 {& F8 G: }' ia、尽量用向量化的运算来代替循环操作。如将下面的程序: 9 J8 o8 X" q0 C7 B ( B! z1 K& d3 W2 z( fi=0;7 j+ c% F1 `- }* i for t = 0:.01:10 5 I; ?$ G8 m6 k; ~8 A1 Gi = i+1; ! M) B' N& \. [, y% ]y(i) = sin(t);7 |* V( f- {" C3 f% q+ R" I end & U1 o$ }4 C/ U替换为: 7 H/ N6 A5 M7 b- }1 z# |# f; Zt = 0:.01:10; ! f$ H5 a( A' S% o) ny = sin(t); 9 c3 ]( H4 o; X速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i2 U! L! s6 ]' U- \ permute、permute、1 Q6 L$ T) H& n reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums $ C+ I$ i& B& c0 Bum、ind2sub、( l/ u( M) k) b+ i4 C; |7 f ndgrid、repmat、sort、sum 等。! \7 l ], Z4 A8 n 4 R5 C- R/ |, H. z+ ]. R/ ?, X% r请注意matlan文档中还有这样一句补充:“Before taking the time to + _. E0 g3 c% n1 o$ ?' W w$ Y6 v) S2 @ M; H2 _9 C: fvectorize your code, read the section on Performance Acceleration.. L* h* f, f; g& r& t. a You may be able to7 j) b- ?3 {. O$ v: P: \" Y8 [ speed up your program by just as much using the MATLAB JIT Accelera3 Q8 M1 ?# L8 x6 Z/ Y tor instead of' x3 x1 W: b5 K2 ]& [4 @+ R vectorizing.”。何去何从,自己把握。 4 l+ ^& P. }0 T( v9 y& R2 i( Y; |" S $ G4 q6 w" v2 g2 |$ qb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 4 D/ y3 R- J( H5 B行循环次数少的, * _ ~+ V/ `8 g; Y内环执行循环次数多的。这样可以显著提高速度。 . @# f: ~' K! ^0 r9 G' M- [# o ' B1 D8 }- \& u+ c5 R( I2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on% E' z C9 k+ j- c+ ]. M/ ? es、cell、struct、 " w1 ~7 a' {( H2 Srepmat等。" [% Y0 q( T" ]& X b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: + H# ~/ M1 G8 N + R r6 I2 E K7 v) ZA = int8(zeros(100)); & `' ~$ \) L, O' l# y4 F换成: ' ~, a# ^ x7 Q* u" V0 ?A = repmat(int8(0), 100, 100);* a4 x$ y. l9 V( Z" K c、当需要扩充一个变量的大小、维数时使用repmat函数。 $ _3 i% q& c( _- ?8 Z2 a9 {) Q% N0 y+ H 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 % `8 j& }; z8 O: Zb、使用Functions而不是Scripts 。 8 l/ A- K- c/ u. S3 |, E {2 n

) a9 [0 N+ P$ {1 G8 |2 p9 {

三、 绝招- W. y& P* q3 m) \ % m# N! ~( t! O, Y- B* ~你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& C+ h6 }% T, I X4 N 1、改用更有效的算法+ `8 q0 Q0 D6 k) k 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 % d4 r% C9 X# z8 T( X* H' G5 { * c- q& p! N5 w3 Z7 r关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ 2 x# \* \( Z9 p* j语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

/ P- H& u6 \$ P) n! D2 ]

加速之前应该先测试0 g: X& x7 E7 A' B" h1 v 使用profiler可以获得程序各个部分的耗时0 O8 ?2 i4 F2 ^, p i% g% s 如此就能高效的加速2 ]6 W/ y: d0 x; D3 T0 R

) |0 ^) {( m: T! Q9 a1 r* A2 \8 B

因为有的时候导致速度变慢的原因是逻辑结构不合理,8 N+ o- d8 U) _3 F3 W6 L) {" r- ~- L 而不涉及程序技术

# o% `% D* j/ ]9 L- c3 H' Y1 ^4 ^

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

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-7-10 13:30 , Processed in 3.571654 second(s), 91 queries .

回顶部