QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab" r! j2 q! M) q5 ?. q: V 标 题: 加速matlab运行的三重境界 % Q/ V! j, K& P$ m+ ]发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)6 I1 H, }8 V' ]3 T9 y4 ~ , I7 d$ c y1 U: c$ d5 J$ X 加速matlab运行的三重境界

. a) M* H- E6 C& J/ ]9 ^; n4 a9 X- W" v' m

一、 遵守Performance Acceleration的规则) a; ?4 N, Y5 X! d 3 H- v) a3 `/ ?2 c 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 5 \2 H. J: w- n) L0 E5 ^2 G. E, a其规则总结如下7条:. |: J: G1 Z4 m1 y" |: V6 t 1、只有使用以下数据类型,matlab才会对其加速:4 k7 w4 @, P" e' N6 W5 J logical,char,int8,uint8,int16,uint16,int32,uint32,double 0 Y. ^( n0 b7 |; Q q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu; i; Y4 l* F8 k( J! C4 z$ @8 V re,single,$ ?7 ]" a$ i& T5 I: g / Y& {' S' Z8 W function handle,java classes,user classes,int64,uint64 ( ~% @2 j; t' L1 @4 l1 C2、matlab不会对超过三维的数组进行加速。5 v, n9 I, ?- F0 _) [# M9 K 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值9 L$ k/ K5 @. O/ n0 P 来表示; 5 c$ }! A! q7 L- D8 m7 F- X) N/ Q$ @b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数4 _0 T; A% l8 h. t6 T 据类型,只使用6 m3 j$ V8 f# L; H+ Z+ [ 三维以下的数组;c、循环内只调用了内建函数(build-in function)。* d/ F; ~4 |* |! Z6 k# J q 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 ( O, q- [2 L2 M% u7 M加速运行。 1 h6 n/ A' w4 n4 T9 P0 J b5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:- I Q3 I* O4 F- E8 u x = a.name; for k=1:10000, sin(A(k)), end;2 G( Y% d+ n8 v1 b1 b% k) X# C 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 7 T3 s/ i5 _" B1 d度。 ( U& l4 h& }+ c+ ^& M7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 : i$ s9 n: a8 q+ s运行速度。 ! o- ^- W. e& G6 \; Q0 l

$ [& {' n( ^7 h7 j' o5 V0 ]. Q

二、 遵守三条规则9 r) U2 } Q2 ~- i7 h0 b) d , `2 X+ K3 ]/ f1 ^8 q8 F. g1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic) I; p/ L6 s# B2 K. B9 Q1 O" E h means it is designed , P0 v) z$ _# W5 }" ^3 t; O% _8 p- g- ~3 G+ L4 J for vector and matrix operations. You can often speed up your M-file c( C! S& P, k0 U6 l2 N ode by using $ J' V s% E# ovectorizing algorithms that take advantage of this design. Vectorizati$ W# R% [1 I$ ]! ~' u1 @# H& O1 i on means converting ( K; m2 L9 h; E [: g" b: Y5 Zfor and while loops to equivalent vector or matrix operations.”。改进 / m5 C3 r5 D! {. N; Q( b这样的状况有两种方法:/ ] C& O1 b- u5 A + ^0 J9 D5 D" sa、尽量用向量化的运算来代替循环操作。如将下面的程序:3 b7 _; o' w, M @2 k8 ?8 Q- D* c7 {+ I2 B- fi=0;+ b4 X, k( a6 m, s% D) \7 X for t = 0:.01:10 3 _' L( N$ T7 K) ^8 Ei = i+1; ; y, N4 G9 Q$ Q% \0 C; xy(i) = sin(t); " ?9 \# f" N: P: a& a5 wend ; w# j1 m: R5 v0 L1 r! S替换为:* v! {" d$ }' ` y, H E2 b t = 0:.01:10; % H7 y; s/ b/ R# L; ny = sin(t); 3 Q2 e! F/ I8 m速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i+ C1 i- [& w' h6 a% D8 t* ]9 M permute、permute、& W/ }) x0 W8 x( ^ reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums 0 H( [" z% |9 d; s; d6 U1 C/ P! }um、ind2sub、9 i, C1 k* o; n ndgrid、repmat、sort、sum 等。1 w1 }' }' T! k r- Y0 p5 ~ - \% M' |9 |8 ^' G6 a请注意matlan文档中还有这样一句补充:“Before taking the time to8 l( a# r( W! ] 1 f$ L/ w$ A: Z, Rvectorize your code, read the section on Performance Acceleration. ; n# d- g; ^# S6 Q2 KYou may be able to 7 e# Z. ^5 }5 m# Jspeed up your program by just as much using the MATLAB JIT Accelera ! P1 s) X1 `* P: b% ator instead of7 s" K5 `. N" \8 V6 I) _ vectorizing.”。何去何从,自己把握。 ) F) H9 k: I1 Q0 e& @5 H6 T/ g! R3 v- \2 W b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 1 I# m! O( s" }: m, V# X: X行循环次数少的, * `9 M! O, m$ A2 j& {% Y; N内环执行循环次数多的。这样可以显著提高速度。4 R* X# Q8 X% p+ I! j6 r+ V j3 r P % N6 b; w5 a' Z 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on! Y8 H4 ^: m$ ^9 u+ k/ Z8 Y es、cell、struct、3 g4 E9 T9 {9 D repmat等。 1 |& c' Y3 n/ p: \8 a, g) Eb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 q2 n6 g# A9 @1 g8 j4 v & T) ?0 L$ H& _ A = int8(zeros(100)); - d: j5 M- N/ V: F4 H) \换成:" T0 I* f, t& X u) n+ i6 W u A = repmat(int8(0), 100, 100); % V0 V" h: v6 |' Sc、当需要扩充一个变量的大小、维数时使用repmat函数。( u9 b' K1 X% f1 K) l8 t6 p ; R7 a, G( z8 x6 C% d+ |- W3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 + j$ m d3 j6 u# zb、使用Functions而不是Scripts 。 * D! r/ C2 S* ^# |: O

3 A* {! R/ i7 ]5 s# _. [$ a

三、 绝招& ~, W- F: @% h, Y + F- r4 {# a8 Y$ o 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。0 w' I" H- f6 [1 H; s 1、改用更有效的算法 5 g7 d; l" j, T& N. W( A& [1 u2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 1 X1 C+ n$ k7 a3 j1 r$ Z& E1 m; d0 h, t( |8 Z 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++" M& p1 S3 c5 N, K9 b& | 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

- @7 R S2 E- d% ]

加速之前应该先测试1 V3 I- u7 e8 [ 使用profiler可以获得程序各个部分的耗时 5 K* m) e, s9 W) A; }# ]: N" L, W如此就能高效的加速 9 W4 g4 y$ G; {

5 T R. l3 r2 C" e* Z- {0 Y, ^% U: o

因为有的时候导致速度变慢的原因是逻辑结构不合理,; r: ` B- K1 M9 Q A3 s5 } 而不涉及程序技术

& K' [* g$ T( z) c% t* ^! r

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

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-4-11 20:51 , Processed in 0.478008 second(s), 91 queries .

回顶部