QQ登录

只需要一步,快速开始

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

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

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

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-1-20 10:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
信人: fork (撒哈拉沙漠的沙), 信区: Matlab
3 r7 i0 c$ n$ K0 ?, y& F标 题: 加速matlab运行的三重境界
2 [- l2 K# O8 k1 x2 ]# ~% |发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
7 V: J  X# _% {- f7 p4 ?% G7 S3 n* b3 S$ V0 K# y. H; v
加速matlab运行的三重境界
) `6 K% Q. O  r: n
. ]* a0 b" n& p" |$ B%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' h$ ^* x5 R$ L% B) b& V0 H%%%%%%%%%%%%%%%%%%%%%%%  |& c! |% w' [% L# \
一、 遵守Performance Acceleration的规则/ B9 Q# t7 @+ H
二、 遵守三条规则
# _( l: L3 S( l三、 绝招
" X6 Y2 V. d+ Q
1 k9 H; ]. V; r: c6 m( L%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" Y, I6 U" V+ }/ ?% S& x& A& N
%%%%%%%%%%%%%%%%%%%%%%%
) T8 T. u- P) s: o一、 遵守Performance Acceleration的规则
/ h. _2 w5 D( I( Z/ g. g; b, ~/ {+ A6 _0 F. n1 J2 n4 B
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
) P8 Z! o% Q: J  n其规则总结如下7条:
' D; u5 G8 M* `: B( t& K1、只有使用以下数据类型,matlab才会对其加速:
- q: f) m) v3 I* O1 E1 c3 O0 `" ?. blogical,char,int8,uint8,int16,uint16,int32,uint32,double( d# Z/ G0 J/ w8 m  f) s
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
. X% `1 s6 f; ]  Jre,single,7 s# l8 X5 |' z! ~( r
8 k0 n2 [2 t4 I/ Y
function handle,java classes,user classes,int64,uint64
9 u' F2 p6 N5 h2、matlab不会对超过三维的数组进行加速。
3 W) U% g. s: {. L3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
& ]% D; G( D  x' f! }1 J来表示;
. s& u1 `( p9 g3 B$ Mb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数: R4 K9 @/ m& t% ^
据类型,只使用
7 g+ T' J, E6 s( ~7 L& g2 X三维以下的数组;c、循环内只调用了内建函数(build-in function)。) e8 h, Y; Q9 ?
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将# g$ A& T; Y( O, n
加速运行。
4 L' N' {2 p/ D# ]# J, w, t" z! _5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:* I- b( }# A8 m& r' N, Y
x = a.name; for k=1:10000, sin(A(k)), end;# ^" H3 n) [5 D1 u
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速. |% y8 P5 M# E0 z4 W: l: z' I
度。
$ E6 I4 {5 v/ O$ h7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低1 ~' G0 q4 q/ ]1 \8 x
运行速度。
5 F/ {# j. _: Q: i. G; X% I; y9 @; `* z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ a; N9 m# `" X* j5 w
%%%%%%%%%%%%%%%%%%%%%%%! ~$ a$ Y# C. h. v, T6 G
二、 遵守三条规则
3 p" m8 q3 d, M& o- W  k
: @9 \6 W+ C1 y& Y- C$ d7 x# [1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic' |$ r; [& H( i/ J# l' j5 `
h means it is designed3 M. T' K" N6 T, x: v0 j8 x

6 Q6 c4 a! {4 J5 p1 P0 Jfor vector and matrix operations. You can often speed up your M-file c
3 S1 O4 Q. Y9 O: }ode by using
* e2 Y0 [0 c0 C2 `! jvectorizing algorithms that take advantage of this design. Vectorizati
5 `8 U$ x0 o8 P' c% Bon means converting' B' v' }% z4 K  E
for and while loops to equivalent vector or matrix operations.”。改进4 O$ x6 H; z$ b$ }
这样的状况有两种方法:
" ^0 O7 A  a/ j8 B: T& c: F  j
$ a! C, ]+ L9 f5 Ma、尽量用向量化的运算来代替循环操作。如将下面的程序:- k6 J+ k% D' J$ t+ j
7 M/ b, X( }; \) w. C' C6 p
i=0;
, D& f- E# d0 o5 v" Y/ Cfor t = 0:.01:10! p- ^1 P$ C" m$ E) v% o$ N
i = i+1;
; r" h+ C1 Z& _y(i) = sin(t);6 q' F' c* c" s" {( I
end1 N# @2 h% y6 L8 Z9 @
替换为:
  n% H. w0 {% F% p7 S9 ft = 0:.01:10;, v' H$ X0 T" Y/ N  C9 T$ E& ~/ B6 o+ K! e
y = sin(t);) n' K+ |. P0 l, m
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i8 O( V& r( \6 {" C8 x9 E
permute、permute、
' C) l/ q/ u# u( g# f1 Jreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
$ p+ D3 |2 @( N' \! v% k5 B# bum、ind2sub、( O7 P" x8 x8 U( q5 o
ndgrid、repmat、sort、sum 等。  w! `5 `- U: _+ C3 a  _. ~

8 u- `! n4 _' ?- G请注意matlan文档中还有这样一句补充:“Before taking the time to
6 ]$ b9 Y2 C; r
3 w; [5 B  v9 _& f( i! l- o( vvectorize your code, read the section on Performance Acceleration.
& J8 n, d) k) q# KYou may be able to/ q, J; v* |! E$ _, C% S+ w% z
speed up your program by just as much using the MATLAB JIT Accelera
3 v; J; B3 u% S6 P4 p) _tor instead of6 Z. z4 a; _6 X6 f' W7 [' _% [
vectorizing.”。何去何从,自己把握。# K8 u- q) v$ w' _
/ ^4 \% b, F7 w# v" o" Q4 a
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执9 W. |- \  \8 X3 G' R9 t; _3 d7 ~6 @
行循环次数少的,7 X  U" B' ^& t$ Q. n
内环执行循环次数多的。这样可以显著提高速度。
( z& \7 q+ z4 I
* a; e) z4 P7 N" e# c) d: a2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on: r' U$ R- q; u$ U1 a2 k9 P# O
es、cell、struct、
/ A$ D* V% M" A4 |% {, K* B4 n. zrepmat等。7 O' T# v/ S5 x# J: t, V9 y
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:, ?8 ^$ }" x! [& k1 c* A

$ \5 t0 U5 z1 V. I8 jA = int8(zeros(100));
8 d  {* d/ P  q3 j1 [) ]换成:7 z1 o+ h* S' c5 F
A = repmat(int8(0), 100, 100);
+ i* N( L' u! j* Xc、当需要扩充一个变量的大小、维数时使用repmat函数。' F7 R) Z0 A# y
& z( A( C5 n" J; ]
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
7 p* q7 s9 r8 H; R, Q2 ?3 s3 J+ {b、使用Functions而不是Scripts 。8 W. o0 N3 N) T7 j
( j+ E+ z% D% s  H
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" ?& }6 T+ u  q% u$ ]) ]
%%%%%%%%%%%%%%%%%%%%%%%
. Q8 P0 V0 L1 R: y5 y" ~三、 绝招
0 Z6 t. Q/ {- _5 P, Y2 @$ @
8 [  w! ^0 k. K$ y, G6 U你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。2 s+ e. f2 U1 t
1、改用更有效的算法0 D9 @$ b5 t+ `4 @! V
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
4 D1 I$ I8 E% r# Z8 {- T. W0 P$ r$ k, s$ ~+ m3 i( K8 p
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++; l( f5 `0 ~5 {* C
语言文件,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-10 02:53 , Processed in 0.344310 second(s), 51 queries .

回顶部