QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab/ [& q+ B& G4 Z/ @. W/ l* t 标 题: 加速matlab运行的三重境界2 l3 i$ |* w8 ~1 e; Z9 [ 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) $ a+ W5 L* c9 O5 D# F7 z 6 b# l; R2 Y, `/ C加速matlab运行的三重境界

* ]3 R2 }# J7 K" {& u 5 N4 i% Q) |) s

一、 遵守Performance Acceleration的规则 2 E# _- s$ f& k! q7 |( e& m. I4 ]6 M( p 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 ! B* A4 p9 U' L9 E& T4 x, `其规则总结如下7条: ! ]! m( L4 P$ m8 T) r6 |1、只有使用以下数据类型,matlab才会对其加速:9 s) ^. R" K4 }5 Q: J* U4 ~+ E logical,char,int8,uint8,int16,uint16,int32,uint32,double , [- l, p9 |& U而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu+ B& J6 ^. u! @; u; e' Z; P re,single,# e& {$ T" Q: m' }- x( l* Z& L 6 \6 S1 D; I; ?function handle,java classes,user classes,int64,uint64 1 T5 ~$ F4 j: G2 y2、matlab不会对超过三维的数组进行加速。' X4 E( U# |0 a$ ~ 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 3 t2 [0 G5 o# M( I% K来表示; - p. E1 x j5 L4 o w+ f! N: ib、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 ) f8 W. n( O) D7 j* J5 j$ i据类型,只使用# l+ _8 d! P/ K7 R 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 ! _. M4 D- X. G/ c! i( J- J2 ^4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将! ~% I* ]0 N' N; c: R4 k0 } 加速运行。. b3 L! f' S8 | 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:: T* Z" a8 L5 \$ M/ H- ^+ V. O; b x = a.name; for k=1:10000, sin(A(k)), end; $ m: b/ v! y2 H( l8 g, x" U# {6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速6 p+ ]" d4 d# V( N! g 度。 - Z; U1 a$ Z" N) E3 c& ]7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 ) O3 i% U+ k4 W, e7 U% e6 H运行速度。 5 J0 n& v6 L3 |2 f4 A; b3 e3 U

$ W/ H+ H, y# Q; p/ o

二、 遵守三条规则8 \6 s* j0 v; A' X2 t 6 X6 N) i( C. N# ] S- q+ ?( G1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic' a5 A- f% o' p3 c* y* a- x; k h means it is designed . T' h/ x# t2 @. z( U4 f+ B0 I6 ?5 x, Y for vector and matrix operations. You can often speed up your M-file c9 e- q# t6 S# \9 ?! g ode by using 6 F4 Y/ O0 e7 C V: |vectorizing algorithms that take advantage of this design. Vectorizati / R; n/ |6 w% h# m" e' A9 T/ I* uon means converting & Z& }, Z% @& X0 D$ L+ `/ g3 B9 sfor and while loops to equivalent vector or matrix operations.”。改进 " H: u- N' S/ b3 K7 T这样的状况有两种方法: - i J: A* o+ l' i$ F( p/ `1 j& S' g, W" ^2 G; S# B+ P8 u* k: ] a、尽量用向量化的运算来代替循环操作。如将下面的程序:: s* ~4 A, C1 H5 w/ U1 o 3 @8 g+ P2 k! ^3 M- mi=0;# X9 x5 k0 q' Z0 q& k. \$ f/ i for t = 0:.01:10" f8 Q2 z" |9 `1 z; `. z i = i+1; ) p3 A) l. G ?1 F: By(i) = sin(t);- R4 _- M Y! W end* B R6 `! j4 o6 S) v$ J( m 替换为: + Z4 y9 @8 [; Z( T4 P% v6 I$ jt = 0:.01:10; ' _% r T, |8 b' |7 k/ u, u' ~3 By = sin(t); " W$ c: ]7 R4 j速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i% c# i, V5 e9 N. T4 P9 ^# p permute、permute、- g" y1 @7 z5 B. t/ { reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums 8 h' W8 Z6 |" P8 B* vum、ind2sub、 , r5 Q6 N* Z G9 X) I$ A: Gndgrid、repmat、sort、sum 等。 ' ~4 V o w9 G * s; x. z' H/ S0 c请注意matlan文档中还有这样一句补充:“Before taking the time to' q% p4 D) f' e# G* e6 t 1 R. l0 P5 O$ ~2 x" A9 J9 dvectorize your code, read the section on Performance Acceleration. 3 v# v2 q6 [ n: HYou may be able to ' n1 u7 {/ Z2 {+ tspeed up your program by just as much using the MATLAB JIT Accelera + b6 R$ x) I% g7 I; o2 G# Stor instead of $ J! i- i1 K1 Z; k7 p# gvectorizing.”。何去何从,自己把握。 6 D6 D9 r$ H& w6 x$ K y$ g+ T: w; w k( i2 [1 W7 b* k9 L b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 7 [# D+ e- G2 r2 Q8 `1 f行循环次数少的,5 Q1 X* Q, o/ C" m 内环执行循环次数多的。这样可以显著提高速度。 2 R- X- T3 ?, h" |+ x3 l , c8 d: `' V+ D1 u1 ?* [- c# W2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on5 `, A) ~; ?- _/ N es、cell、struct、 + k+ R3 t& k$ e5 |9 a1 orepmat等。5 t. k: @% N! m* N3 |+ j/ {: ] b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: 7 t# o" }( t, t3 M% K , \$ [( x5 B6 N9 ?- W$ lA = int8(zeros(100)); i* ]0 |8 B( b6 ^5 O, L换成: 6 K6 _0 d3 N7 {A = repmat(int8(0), 100, 100);2 R- y% ^3 ^, m/ o% B) z, ` c、当需要扩充一个变量的大小、维数时使用repmat函数。 # E8 q/ u) \/ l9 u2 z1 x & J* K: w6 ^$ X; e+ c1 v9 T3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 / |3 A* M3 m" m9 K: N- ib、使用Functions而不是Scripts 。 ( X$ g* F. \3 G& ]$ J2 e

4 N) _, [" @( p# z

三、 绝招; s% A* I [) i9 g, n * @5 t ?+ P/ e) N) k4 ~# S0 h你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 2 g9 U0 i; @$ @' J1、改用更有效的算法 1 ~; }* K3 F" L* y1 T9 L1 U* y: D6 Q0 _2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 ' I. v+ z& W; T% W, f/ D- b) X3 C4 w* }' g. n 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ % Z! A, M. o$ M3 m语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

( K/ C9 k9 e; `( N

加速之前应该先测试; [( b0 t! D: N6 c6 _ 使用profiler可以获得程序各个部分的耗时" X8 M$ u- z+ Z. j. z% f 如此就能高效的加速 " \4 z4 b2 H' x7 {4 r0 O

8 _! Z$ \) S7 B T4 W2 K

因为有的时候导致速度变慢的原因是逻辑结构不合理, 5 _# T; n& j, B( d, D6 ^而不涉及程序技术

* S; j$ D3 ?7 S. N. ~

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

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 08:55 , Processed in 0.688947 second(s), 91 queries .

回顶部