QQ登录

只需要一步,快速开始

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

[转帖]加速matlab运行的三重境界

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-1-20 10:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
信人: fork (撒哈拉沙漠的沙), 信区: Matlab, r& j# u2 w& g6 s
标 题: 加速matlab运行的三重境界
0 u) J0 y3 ?2 `" M* ^发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
4 i% r! _, M  f3 w# D- Z9 ]* x% V3 _- B# y$ B! s6 u
加速matlab运行的三重境界- u9 s! {1 a8 Z5 W' l

9 W! I6 f/ y" }. _" i% G3 o%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 a- S( u7 k8 s" W3 V5 @%%%%%%%%%%%%%%%%%%%%%%%4 L: e3 x+ {& e$ W- E1 N
一、 遵守Performance Acceleration的规则1 E. g. C) O! K% M; W* a  }1 a
二、 遵守三条规则
+ o5 H/ ], M; F9 k/ S/ @8 t三、 绝招- D. V0 |& r8 ]& `
) q4 r0 l+ R' q4 B9 ]& K9 l% ~, x
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# a" K' H% ]8 M2 U( y%%%%%%%%%%%%%%%%%%%%%%%
. X" X, n5 C- ?$ X0 M" m5 g一、 遵守Performance Acceleration的规则& Z' Z" s: \: \2 P( P1 L

# ]0 c# @3 r- M! }- g: j# g" W0 D关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
9 a4 `9 z, e; s- w- h其规则总结如下7条:5 q- M: A, ^- Z  l
1、只有使用以下数据类型,matlab才会对其加速:
# D3 l) P5 J; n" glogical,char,int8,uint8,int16,uint16,int32,uint32,double5 ?, j  I, ?/ n! B) x5 b
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
! N8 e7 Z& w8 m! U9 c3 Hre,single,
/ f& Y4 G1 D( w0 Q* c3 J8 T0 u' R/ l$ r8 b7 E& B5 n1 I2 z4 Y
function handle,java classes,user classes,int64,uint649 }: Q) s# Y/ `" ?: W
2、matlab不会对超过三维的数组进行加速。' v, W# X4 u8 j* u8 N% M1 S9 l6 }% i9 [
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
# K3 J: g" U/ g/ j1 \6 [来表示;
. q. V; b  S5 n1 L" y( A) \: O2 Xb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数1 z0 {  y+ o/ m) n
据类型,只使用* O  d: P% p# r9 A% I
三维以下的数组;c、循环内只调用了内建函数(build-in function)。7 n+ p0 p. ?1 x1 `% U& P  t) N; K( M
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
! g7 y! t6 I- q; q( l; M( U加速运行。2 T" w" u, [& _' L- P& o
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
2 m5 q; y" m) k3 d$ {0 L& i) Sx = a.name; for k=1:10000, sin(A(k)), end;/ ]* O& L- J$ T4 c% z- B! @
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速# |6 N1 I9 w0 [" @* v3 x9 X
度。
. M- r9 l/ I8 x' F$ e7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低6 I& A6 ]- @# @5 u* B+ o* V* f( k9 v
运行速度。
* `# K# ^6 D( v* V  _
6 a6 R! U/ y/ {% {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 h+ @+ q; t. N  p0 k
%%%%%%%%%%%%%%%%%%%%%%%! j$ P" a# `% G# [& h3 R
二、 遵守三条规则. Y! T* F2 U4 I0 m

4 [, c; L( u0 _7 r7 W1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
( ~* l$ A$ z. G$ ?/ }2 q# T: P3 Lh means it is designed
- U- z* b+ W+ W3 S# v& J7 n0 k
5 t) p/ K8 S' n1 S) l: v, S* u+ c# mfor vector and matrix operations. You can often speed up your M-file c
; n: d+ h" {* Z* {1 Y$ `ode by using
% Z4 H+ ]% }# e. @: @0 M$ Fvectorizing algorithms that take advantage of this design. Vectorizati
8 j/ ?! a: B# R7 H# B: Eon means converting& l5 R3 ]" k% N
for and while loops to equivalent vector or matrix operations.”。改进
& `; ]5 O: y/ m0 L0 J这样的状况有两种方法:6 b) S! w- k8 j  a$ e

9 R, z/ G; N( y% @% r5 ^' ma、尽量用向量化的运算来代替循环操作。如将下面的程序:! ^; b4 J  U2 x" A. O, z4 {
4 r6 y, W1 B/ u; T
i=0;
' Z' \" V6 K& ufor t = 0:.01:10
# G! S% ^) `% a1 a4 U7 li = i+1;
1 h& x8 x7 O5 @6 vy(i) = sin(t);
$ ^7 o) h; d1 H' i7 pend
9 h7 \0 ]5 H7 `# U7 N# `4 m替换为:' \. j, Y" A0 J3 ^0 G* V$ x+ R
t = 0:.01:10;
0 t& v* Q$ R( f! Z: Dy = sin(t);
  ~/ t/ F0 x3 i% L, J/ D速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
$ H+ r" T3 r' p( g$ s2 ^7 H6 Zpermute、permute、- }4 q6 k+ r# |5 K
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
2 ^: ?4 }8 m- P* E2 num、ind2sub、
1 y/ ~/ r" k- S9 r2 Andgrid、repmat、sort、sum 等。
7 b$ s, M. b" H3 |5 S, y  ?) t: L, I
请注意matlan文档中还有这样一句补充:“Before taking the time to* h. E# H. n/ N( s+ X/ o! \
; C2 Q5 q0 m+ k
vectorize your code, read the section on Performance Acceleration.' ?! n; L& H- ]* {( F# b3 d7 S
You may be able to( h- L3 k/ t: j8 I  ?& E( x
speed up your program by just as much using the MATLAB JIT Accelera4 B& j# E( A5 S  H3 l# Y2 p1 U
tor instead of' \* M% ^: e  ^. y+ N
vectorizing.”。何去何从,自己把握。
. ~0 P$ w% n7 v! B7 L
( g9 r0 p" _! s# x9 k& ~% ib、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
4 E8 [2 U/ |+ D( E3 e  Z行循环次数少的,
5 P, q% [8 L9 }5 {内环执行循环次数多的。这样可以显著提高速度。
' t; X0 f& O7 _' W! b) }8 X
' J6 |4 d' @! d/ p( n2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on# l# ]; B  j' {- g  @, e0 Q2 R2 U
es、cell、struct、* M- O9 W3 t4 h
repmat等。% {4 X$ Z( j/ y  f+ V# M) Q
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:% k7 ]9 }0 T' ?) b; k

( |* v/ G0 I9 A$ S* h0 W1 \A = int8(zeros(100));
3 d% W: G9 V8 [3 `$ R) _/ j换成:! u8 w. s; F4 C! o$ S# ^$ S& X
A = repmat(int8(0), 100, 100);5 u: Y: K+ f6 _% J  M$ a3 P9 t
c、当需要扩充一个变量的大小、维数时使用repmat函数。' Y) b% S" b4 [% R

! ?$ x# c7 [6 Z3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
% h* W+ m3 K) Vb、使用Functions而不是Scripts 。
8 E) M/ ?; H5 B1 \
& \1 F% P5 a- u%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  n6 `# L+ G- x/ W" i( |' T
%%%%%%%%%%%%%%%%%%%%%%%
- g! p6 w" q! C$ G: n三、 绝招
3 ~: W/ S. d  c; i
0 p3 Y, F* e" ~0 ^' V你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
1 ?2 x! W9 P! T1、改用更有效的算法9 ?; A5 p( A# n! Y
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。7 i( y& o. P- j" E; M- N/ }6 e- U, C
) }: b" t3 g0 Y7 c
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
& ~3 @- S, N4 S8 O语言文件,VC编译
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

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

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

蒙公网安备 15010502000194号

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

GMT+8, 2026-4-11 19:20 , Processed in 0.421615 second(s), 52 queries .

回顶部