QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab 3 _6 M: Y1 R- w* B标 题: 加速matlab运行的三重境界4 L1 i7 f, ]( ]8 K2 t, Z) Q1 a 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) ! M4 g& \& F' E. |; a- w4 x2 ` ! [0 o* v9 W2 s3 z' t: A! Y/ A加速matlab运行的三重境界

9 J& G& o6 }) o1 Q/ d) u6 E2 I+ J) \4 V( f4 ]7 p- ?

一、 遵守Performance Acceleration的规则 & @$ @! Y" P4 N; d! C ) o N8 J3 U h5 W4 r: k关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 ! B( z% O9 u, k/ ?8 {其规则总结如下7条:# n2 S& P" z. D4 q5 V 1、只有使用以下数据类型,matlab才会对其加速: 8 a% Z' _4 k# Ulogical,char,int8,uint8,int16,uint16,int32,uint32,double2 U9 A: o8 b( Y. L 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu, S3 |' t8 o! B- n4 ^) P" |0 n re,single, : N0 P# [; [; D/ U' K' u) m, Z - j! L4 U6 Z/ o$ Z2 l1 s4 _function handle,java classes,user classes,int64,uint640 r g$ u& Z- O7 k4 Q4 s9 u 2、matlab不会对超过三维的数组进行加速。1 |3 f: t& U# K5 ] 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 $ f5 g0 W1 S/ U8 h: Q3 t6 N" |来表示; 5 S. _5 A7 f6 V/ E9 Tb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数: D% z- v$ A2 Z# u) @' {! q) @ 据类型,只使用 . ^: P" v/ r' r- W. l4 y+ a- K三维以下的数组;c、循环内只调用了内建函数(build-in function)。4 I- t4 V6 ]* p" a' _ 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 4 P5 @; T8 t+ H+ R( ~+ v加速运行。- N# ?! }' w( ?/ e0 ?) ^ 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:& d: \5 ^; x4 @* k x = a.name; for k=1:10000, sin(A(k)), end; L) n8 Y8 G* p$ R( k 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 ~# q% i) d- x$ o; n8 Z! y. y 度。 * c* E2 l! U9 S& ?% F3 ?7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低# V& |6 Q$ t' P, d# X' ] 运行速度。 + P. C9 d% Q q0 K; D

& f7 A( |' w* w. l

二、 遵守三条规则 . E* {- r/ q0 W$ z2 K4 a t 9 P; m% e1 H* Z' n" W1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic 1 y- K* s- ^& u+ m7 M. wh means it is designed 7 E! x* l8 s, d) v 8 K7 f; K) ~9 f2 u/ W& Yfor vector and matrix operations. You can often speed up your M-file c / v: ^ S5 ^; d' `4 pode by using% H$ n4 t5 ~) |6 @& t* H3 b. }3 D vectorizing algorithms that take advantage of this design. Vectorizati6 T" |. w6 n9 m. G on means converting5 g; U- k) b/ X* A9 j for and while loops to equivalent vector or matrix operations.”。改进 5 \4 p3 E3 Y2 l- I+ M9 ?/ t这样的状况有两种方法:) k8 O: B1 n: S ) w1 w7 q4 u6 C9 K- f$ [a、尽量用向量化的运算来代替循环操作。如将下面的程序: ) t* P& b) F, X . y ~: a |6 y. p" W* W: Si=0;" Y& l' B# J: i, \% V( F" L/ O/ S9 m for t = 0:.01:10 # p% T9 z6 `4 d: o' E2 e* n: ]i = i+1;% U- c5 h3 g% n8 p# c y(i) = sin(t); / ]2 v8 Y6 G4 @7 `- _' Wend ' }4 I; E# S! G+ ^) l2 y) a4 g替换为:$ s( X" ]5 H2 h, A5 @" u6 ^7 m% z3 e t = 0:.01:10;% b) V ~" y ~3 r8 x& b% F y = sin(t); , _3 z% ?9 S& T4 ^4 I% l速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i6 X: R& O' ]5 d$ {6 k* _ permute、permute、 ) m, |. B3 {. }& z2 Xreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums( N8 h1 c0 z' i1 ?' R7 N# q+ p um、ind2sub、& S$ W4 c# t1 k) `: K4 d7 n) M# J0 a ndgrid、repmat、sort、sum 等。5 K/ V5 z5 F a0 S; S# F$ |: Z ) [3 Z1 b: v- ~- {4 R7 f. A请注意matlan文档中还有这样一句补充:“Before taking the time to7 z- w5 y: d- d. b) \: o+ D / Y+ f4 A# D/ ]* H vectorize your code, read the section on Performance Acceleration.! p V+ }/ K# l( z" u, H) O2 }. r2 @ You may be able to; G7 v- A7 z# `1 o; X speed up your program by just as much using the MATLAB JIT Accelera * C& d( K( P/ F& n8 Y9 ~tor instead of 1 `# j# ~+ q$ `9 z% xvectorizing.”。何去何从,自己把握。 2 V) K+ g6 ]( a- B ( C* v5 Q5 L) W. wb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执: b( c i& V, |: u- ?2 J3 Y 行循环次数少的,+ P. o I, E! r+ C& T 内环执行循环次数多的。这样可以显著提高速度。+ h' h( K/ k: O9 u4 {: T, D- ^ 2 P/ a2 J- A8 N 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on- U8 q! u# i/ m1 I es、cell、struct、: E/ @7 G2 s7 P$ u1 }, N7 k repmat等。 + E; Y1 l/ f- }4 y' [# nb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: 2 o, H2 |! u- R8 U1 Z' U9 S2 I& n% q: A4 z! c7 F A = int8(zeros(100));/ B7 q) g; s. k; Q: r 换成:4 |2 G5 ?1 @5 p! | A = repmat(int8(0), 100, 100);5 H) H( v3 a M. x B4 T c、当需要扩充一个变量的大小、维数时使用repmat函数。5 b7 p0 E# t, | ; V, W0 C' Z4 R1 V0 K/ U* e' R3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。3 v4 d t- a6 z* i b、使用Functions而不是Scripts 。 4 T& }- `6 g* @" S: R. U' V+ z' n' N

1 E- H) U7 E* O' W W

三、 绝招( v$ N7 w* T N- T- y/ ? 9 P8 d! ]! Z3 _: A 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 8 ^+ v7 L$ d3 x1、改用更有效的算法0 s7 [2 j+ e9 Q% O0 Z! q 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。6 B( [4 Y/ k3 V 1 R7 O8 n' `& G/ ?* U1 ~; B关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++' a! z" u0 V& W e 语言文件,VC编译”。

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

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

http://zuozw.blogcn.com

布赖        

4

主题

2

听众

134

积分

升级  17%

该用户从未签到

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

注意

4 V2 i# k' x8 p! u

加速之前应该先测试 # T( E1 |2 X; w% r# O使用profiler可以获得程序各个部分的耗时- M6 n+ o; j c/ z+ U; D 如此就能高效的加速 - P, O4 c) d, ~

" ], k% Q$ d5 \) h. B. [: H

因为有的时候导致速度变慢的原因是逻辑结构不合理, * R1 Y8 B5 U1 y; q7 m而不涉及程序技术

* D' v' o# D' a) I: }8 S7 z( Y& K

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

http://zuozw.blogcn.com

回复

使用道具 举报

ornewuser        

0

主题

2

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

fup        

0

主题

2

听众

43

积分

升级  40%

该用户从未签到

新人进步奖

回复

使用道具 举报

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

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

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

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

蒙公网安备 15010502000194号

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

GMT+8, 2026-4-11 17:45 , Processed in 0.508568 second(s), 97 queries .

回顶部