QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab1 b6 S5 ?+ |9 Y; N 标 题: 加速matlab运行的三重境界1 g# O ^: P1 f' a. L5 K) l& i; V 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)* p' c: s+ k/ J/ @) S # C$ A1 _* ^0 g) x9 C2 A加速matlab运行的三重境界

' V) X2 O+ X& b$ b' q 7 S- i0 D* R4 M

一、 遵守Performance Acceleration的规则 ! n' Z- S, k, P1 F+ H. a2 x 7 f, H- o8 `8 p; H% A关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 1 {& T! f; e" a* ~0 Y+ f其规则总结如下7条:8 \2 Y8 u& I+ ^2 k' J9 b- q 1、只有使用以下数据类型,matlab才会对其加速: 8 X5 D5 R% t. s+ qlogical,char,int8,uint8,int16,uint16,int32,uint32,double ' t8 {0 n) D# I. ~( r6 }而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu5 I7 Z) K. j5 |& h) X. r% M re,single, 9 W6 D/ W" D4 c4 ^1 T5 Q8 g$ Z3 I: F+ N$ z- W9 \/ \" K function handle,java classes,user classes,int64,uint64 " a; C5 [" l; N( r7 u) {4 A2、matlab不会对超过三维的数组进行加速。 , q) l2 |- {, ^. D) O, I6 i3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值) F) b: {) ?+ Q ` 来表示; 3 H' d, i/ F+ Y# f0 a1 L" z2 ]) [* h, fb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 6 M) ?. A7 C4 H4 S据类型,只使用* r2 p) a' _; F' j! N 三维以下的数组;c、循环内只调用了内建函数(build-in function)。 # C1 A f/ ~0 h+ P" k5 Q4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 4 H$ r4 O4 E5 z6 ^# m加速运行。 0 V1 M; a' \7 {2 w) Z5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: ( l, @: |& F( ?+ rx = a.name; for k=1:10000, sin(A(k)), end;+ _7 v3 d1 q! Z! x1 A, L4 E% m 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速2 s& |4 D' _5 l* r% v- q4 E 度。' k: d0 I# D) ^+ I7 W' N9 |: k 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低5 S3 f4 E, X2 M. H/ A 运行速度。7 r3 @7 d% W# j) a$ _

4 Y" U5 e! [* p" @1 Z: V* y

二、 遵守三条规则 . y# x; r7 \7 b5 V9 F& Z! W7 a; c. P$ _* m 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic8 G# T5 z: j; H4 T( `! t8 D h means it is designed+ J* W0 P! Y3 X2 F( [- S9 x+ _ 9 r; Q( h/ ^0 m for vector and matrix operations. You can often speed up your M-file c5 w- L7 x8 z; H/ Q% b5 ^ ode by using; Z* b! \4 R8 x* m- H$ y; k/ F vectorizing algorithms that take advantage of this design. Vectorizati) f: T4 M( s; q on means converting: k. _1 o$ z+ p3 v" N" _ for and while loops to equivalent vector or matrix operations.”。改进 & T+ U$ D/ E$ O. ?( b6 b& B1 Y1 K这样的状况有两种方法:: Y9 u3 V4 c4 e+ ]2 Y9 ^* ^ 2 O5 p( p {, Z: g# T; |0 ?a、尽量用向量化的运算来代替循环操作。如将下面的程序:& C# ~4 }4 ~4 x$ G9 @' k. b% Z) T 0 f% x. H. h8 l: p( s: e3 K- c i=0;9 |% L( w" |4 I2 l, n2 ?0 K for t = 0:.01:10; ?. S4 l$ _. T; U9 {; r i = i+1;% ~# a) E! ]3 E9 Z y(i) = sin(t); : e( E, h/ t" d1 ]1 E; x& C# fend ]7 @& L; L" |# u% d: { 替换为:% H9 i* @! e5 A- p+ D3 l t = 0:.01:10; + }0 f5 ?" U( N0 {. z; m% q. X' Ty = sin(t); 1 z& D# W A& P速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i* `9 T1 Y* l( j' ~ permute、permute、/ L/ Z4 V" ]5 ^" c5 Z" n reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums0 X) V7 e* u3 n) E' Q- j um、ind2sub、, O2 \" e* P! ^# e ndgrid、repmat、sort、sum 等。 : `: A+ T1 T% y; [/ U 3 G/ V. o& N, h请注意matlan文档中还有这样一句补充:“Before taking the time to w o+ P) @. C4 H H0 ]( p5 X+ d 5 {0 L" t; k2 }vectorize your code, read the section on Performance Acceleration. 3 \9 |9 `: K1 J% MYou may be able to4 _3 {1 [: P& m' Y- x3 J/ \$ s speed up your program by just as much using the MATLAB JIT Accelera) l# N& P' ~6 {- q7 z3 P" K$ b tor instead of 7 Y6 I& D! M) _9 ~vectorizing.”。何去何从,自己把握。' u, y: ^" ]9 j _+ b6 i4 X7 H c6 R. |( [ [* x b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 & i* H( D: J8 f: ^+ l3 H行循环次数少的, : w2 B) B/ j& Z7 O' p, Z0 e, D内环执行循环次数多的。这样可以显著提高速度。 9 ]3 Q( d- y1 X& N+ @8 R 9 c- u t7 h2 K* L, r t$ c: _' V* J2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on1 k& `1 {5 R# x* r es、cell、struct、 ' w9 M: D7 W1 s3 }6 i/ P6 z/ xrepmat等。0 ~$ T- d. ?5 [& R b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: Q; H3 `/ |. o; f) M3 E8 I0 o1 c' i( Z( L' Y A = int8(zeros(100));3 i# ]$ ~) f, Y& q 换成: 6 H* Z/ f; r; k* Z% mA = repmat(int8(0), 100, 100); # j [; \7 U' |# f' ?' |3 qc、当需要扩充一个变量的大小、维数时使用repmat函数。 ; O0 t: N9 G& c; L / u- L! R; R/ b: e0 |7 M3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。1 h9 f8 K6 v1 e7 _ W b、使用Functions而不是Scripts 。- U! p2 x7 ?9 Z: ?, p

# ^( Y1 r7 ?( f+ `

三、 绝招 , [1 m4 a! G3 C$ b7 H% b, G" _" K3 O. @ 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 5 H9 m: V% _+ F& |" S) p1、改用更有效的算法 & m% w/ y2 L1 a! F5 z/ `2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 - M% G. p$ b% m5 ~6 U+ V7 G6 p5 C3 D/ C$ ~- P# V 关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ ! \( {0 q0 \: C7 {& t" j' f' ]! U语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

4 ]. Z. c) O y, O

加速之前应该先测试 7 r7 Y+ \1 Y6 k) W! e* F使用profiler可以获得程序各个部分的耗时4 D2 @) u3 M5 U2 l4 j0 K 如此就能高效的加速 0 D3 c( G' f- W/ R5 m

* s0 u; Z2 k* f% I% Q' D- _! Q! d

因为有的时候导致速度变慢的原因是逻辑结构不合理, - |& c, h* \# v4 L P% R而不涉及程序技术

5 B9 j' c. n& q8 d. E

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

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-10-12 01:32 , Processed in 0.668501 second(s), 91 queries .

回顶部