QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab, |7 i3 Z) }$ d* ~* W: f5 o 标 题: 加速matlab运行的三重境界 6 O2 W6 F1 A8 E# q- G- d, T发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) 8 p# g- P. q$ j' D. a4 I& \) A* T; Z; N ?2 Y 加速matlab运行的三重境界

. {4 G3 K2 x) ^6 @% y3 ? ) T* x5 l6 T. I

一、 遵守Performance Acceleration的规则 " T, |" N% J, m* p" d# T8 X' @7 Q' Z% B& T 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 6 }% a' K. |& I) r! \5 [! }7 P其规则总结如下7条: 3 Z3 W, Y* ~) r( [1 }1、只有使用以下数据类型,matlab才会对其加速: * ` J- C# Q# O8 J# q9 Tlogical,char,int8,uint8,int16,uint16,int32,uint32,double/ c2 L7 K' }5 ^0 ^ 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu2 b, t6 R/ w( i: R( z) X re,single,+ H F7 y1 }9 y/ t1 X& L4 g % x8 B! n# S* E! e5 a function handle,java classes,user classes,int64,uint641 D0 G7 t. R6 T, g& s 2、matlab不会对超过三维的数组进行加速。1 P8 {" ]: B6 r- k$ k 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 & C* {8 ^6 ` s, M; Z- M# A/ \7 v& A来表示; - S. L3 k- i: w9 ?, gb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数; D6 g$ c, \7 n: k. k 据类型,只使用 - z& g% h2 [# Y5 f0 z三维以下的数组;c、循环内只调用了内建函数(build-in function)。 ! M$ @( Q4 V' G$ P+ R$ W3 R& e/ a0 [4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 ; X9 a* b( \ c6 W8 ~加速运行。( S+ b/ u( F" y" T% d) }* w4 X$ G 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: ( }) S; M2 Q8 s' L9 ], zx = a.name; for k=1:10000, sin(A(k)), end;* @. a! J9 v7 U 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速2 S0 V _% A+ a 度。 8 ?2 e ?. ^' V$ C- s; N7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低, \0 C: L- s2 c/ w1 P 运行速度。/ n6 w- l( `: ?; z: L8 o; a+ v

# w2 }4 T: B: \( {

二、 遵守三条规则: ^& t3 k: N; V: ^% e # ?, h1 W! c4 R" X: Q N1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 4 P. h* D3 R) z4 N, Ch means it is designed: C6 o; P0 J6 C: `2 p* C: f 2 f$ e! v8 e2 y4 g% e for vector and matrix operations. You can often speed up your M-file c, N# k/ S6 y8 s2 @; z2 z ode by using+ ]( A# C' O- s1 U7 q vectorizing algorithms that take advantage of this design. Vectorizati + W- H. M, l" |; X$ s1 j7 n8 z" [on means converting; g" D. X- M, C% s' l0 D for and while loops to equivalent vector or matrix operations.”。改进9 _" h: e6 W `5 f! Y s 这样的状况有两种方法: 3 F% Z# m& x( E$ N6 d% m6 r) p 5 j1 k( f! a8 c' Ua、尽量用向量化的运算来代替循环操作。如将下面的程序:$ K: o( J9 l1 y3 F$ |7 J . h; j, y9 _4 O) m% f: Ji=0;- F( M: @& t1 l, M for t = 0:.01:10 W! Z9 Z# L1 M1 Fi = i+1;) X2 L$ k; [9 O; T) P y(i) = sin(t);1 x. { u+ w+ }* `, _ end 6 }. P" E0 X. C0 F替换为: $ l1 f. Q- Y" z9 H7 y5 H- Xt = 0:.01:10; ; }3 R, l/ n: Y6 jy = sin(t);; o4 [! l# X p9 `5 R 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i2 ?1 t8 |* N3 H# E" L4 n0 B permute、permute、 r& b3 h8 {" A3 x- B$ v7 Ureshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums8 v- w$ T" a" V# {/ X um、ind2sub、 ; A" U* {- A- andgrid、repmat、sort、sum 等。 8 g" A" r5 E7 R8 ^. a8 _) T9 D* g/ G$ h8 A 请注意matlan文档中还有这样一句补充:“Before taking the time to + ]8 i3 ^9 M$ V+ ~9 z+ k 7 P6 s6 j$ v8 x# _2 {, tvectorize your code, read the section on Performance Acceleration., g; d* a- O5 b% V+ N You may be able to & }+ W& N! G2 D( hspeed up your program by just as much using the MATLAB JIT Accelera" o) W- C+ K9 z* o9 a2 D' t" a5 y' V tor instead of 7 q' g1 J! j( U6 e L7 I# F' Tvectorizing.”。何去何从,自己把握。 . Z0 O9 a- }- v/ o2 X) t 2 x6 W, p) t& K; tb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执6 A3 B) c0 ]. h6 X0 P' f 行循环次数少的,) Z U2 @5 _. `, m/ [ 内环执行循环次数多的。这样可以显著提高速度。- S- o8 p2 y+ y, V ( d; B Q' R/ X! W* g2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on6 c% @7 X" E% d1 X% a V; g* r8 t6 L' l es、cell、struct、 7 ]/ y9 V1 m2 H7 D, l ^repmat等。5 q. c8 o$ v) M+ i, W8 D, Q$ d b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:$ C5 a# |8 r" {% _4 l l ( E9 e0 r) j. tA = int8(zeros(100));7 @$ D& K1 x7 s, r6 E) w: J 换成:5 d7 @0 V/ u* T6 O( H! ~" ^ A = repmat(int8(0), 100, 100); u& m% c, W2 i/ e( I0 v" v: b, v c、当需要扩充一个变量的大小、维数时使用repmat函数。1 `- R0 l; g- _( L / _& m2 P* a8 x; R 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 $ G+ h9 K' D* s( v J" mb、使用Functions而不是Scripts 。 ( z" D: v4 H1 V7 u+ g8 i

+ o& b3 ]9 @; h" W1 ?! |

三、 绝招8 b1 f7 c4 e6 v& ~9 y/ k" x# n 3 U: Y: ~! V$ j/ y2 q 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 . [3 ?' L5 G) T8 {. |& _# I% |; {: d1、改用更有效的算法 - o5 x" n6 U* G2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 ' W( [* j9 J: f1 e& W) r8 F* X' H2 Y7 v+ D 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ ; Z U; M7 s# ]. P' J5 _语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

3 {% p* f G- t3 f6 G6 w

加速之前应该先测试7 W, d8 Y \' B# Q 使用profiler可以获得程序各个部分的耗时 ( p" {; l/ x' ?' x) u如此就能高效的加速# S% H0 P' U& v+ A0 [

% c( E- {: x( \ r

因为有的时候导致速度变慢的原因是逻辑结构不合理, 4 E3 R1 u# N! j, k而不涉及程序技术

' ]( W( p+ K! w

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

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-5-26 10:01 , Processed in 0.480235 second(s), 90 queries .

回顶部