|
非常实用的Matlab编程技巧。可以试一试。
1 P3 S" O x1 U4 P- g. OCTerm下载文章: 紫丁香★+ t5 m1 X c, F
. ]1 g; t( g/ U3 |发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
2 c- Z0 ]4 J" L7 s, V0 T2 A标 题: 加速matlab运行的三重境界
: k' u) N; F: a发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
. g- |" S+ h: K+ d% g" P' @
! [& b. E( M# \: A" F加速matlab运行的三重境界1 u: @8 c3 b" W V! T
一、 遵守Performance Acceleration的规则
* U& \* y# B9 z1 T+ q二、 遵守三条规则
% @3 g4 f; ]3 g5 a( M: Y% D" u0 ^. Z三、 绝招
% |9 z" d" N0 |4 ^1 K- ~. t
一、 遵守Performance Acceleration的规则
& t3 `% c" p1 ~- @4 w5 e0 R9 A+ j
5 r7 v& `2 E" T" S/ Y" W关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
2 ^) l# Y ]& \) `9 Z/ H其规则总结如下7条:
6 G; E3 z# {# l; {0 \# Y1、只有使用以下数据类型,matlab才会对其加速: n" F/ s6 j! c$ u; Q
logical,char,int8,uint8,int16,uint16,int32,uint32,double. D5 h9 `$ n" Z
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
5 F- X% M% }, D" d0 Jre,single,# s) _8 m4 |5 O- y: Y6 n
) [7 }) U) n; h: }
function handle,java classes,user classes,int64,uint641 b/ o9 h0 V2 w5 H4 Y5 d
2、matlab不会对超过三维的数组进行加速。8 E& M6 _( C0 l( q' N
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
- E8 Q6 l) a; ^来表示;# Y& P% z- y: P# y3 i
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
c* J' G" t6 d: s据类型,只使用0 ], S9 ^5 o/ g5 ]
三维以下的数组;c、循环内只调用了内建函数(build-in function)。# D0 o' B: y+ m K
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
% Y) {9 M0 r! n% H加速运行。
' _* v8 m" N$ D$ c6 O2 `. b5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:8 Z/ |& O% s2 B) a0 ]; Q/ v6 M
x = a.name; for k=1:10000, sin(A(k)), end;! T( a. M! n8 P9 m/ w. \
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
# v3 [8 E* p( N度。
; _& n( V. R1 _: f% N1 O7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
h2 W }; B7 |6 h) R- P4 `7 _& _运行速度。4 h2 B; [8 G6 }6 y2 `0 S; g4 p
8 ~; G) z- a/ n! b! p/ H
3 P" |: G' c ~$ ~) a- ~* J二、 遵守三条规则1 Q" O3 V% O" d5 z, x
# R% `* | c0 Q/ t$ {
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic" B: r$ z3 V" X
h means it is designed
( w# v7 T' v% B4 c5 X3 r
7 R% G$ {, Y$ [3 J/ R- E* W" G4 ~for vector and matrix operations. You can often speed up your M-file c# A# X7 u; m' U. D
ode by using. D# z8 U% u8 D1 k. m9 w5 e @ ]
vectorizing algorithms that take advantage of this design. Vectorizati% r' e* R4 N3 M4 B+ v7 `; G; n
on means converting9 S) y" G8 e9 X7 g) T( L
for and while loops to equivalent vector or matrix operations.”。改进
* Q# L s) p9 h6 G' }% Q这样的状况有两种方法:' X/ F. d: N' j
3 `' h* V: k: a" s- r8 ca、尽量用向量化的运算来代替循环操作。如将下面的程序:
6 T. Z4 ?% Z. x3 Q3 b- C% z$ Z9 {0 ]) M6 T" w$ z
i=0;
' Q# `! m N0 F. C P8 tfor t = 0:.01:10
" L9 \( r' V _i = i+1; b) ^. d: ~* k! w5 ?
y(i) = sin(t);
3 Q8 f: F. E* I/ f4 Dend* H, _- u5 l! O/ ^- I3 i' i; W
替换为:
7 A0 i4 F2 I# J! y, C$ w. ^t = 0:.01:10;3 J# v5 c# c, V
y = sin(t);
# q9 i' j' D% B5 \! d0 v u速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
0 k8 G) l9 h. N6 E+ d3 O6 [7 c! [permute、permute、
) `3 D3 }0 N G' m. yreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
/ F4 m6 k7 E7 ]# e0 Uum、ind2sub、
" ?/ O* p: @+ x: p lndgrid、repmat、sort、sum 等。# x# ?. f- A* |& Z1 W2 s
6 m' U( O& m! w5 S" V请注意matlan文档中还有这样一句补充:“Before taking the time to {' K! ^5 @& ` a
2 A) T2 E: t% W* @. W# M& N% m- Fvectorize your code, read the section on Performance Acceleration.. h7 b) x1 y# y0 d- L" e+ i0 X
You may be able to
- D# N; O Y( ?5 X2 Ospeed up your program by just as much using the MATLAB JIT Accelera
5 q5 r, s0 t- a) q% i8 Ktor instead of
* X- ]; C, l. m9 G& y. ivectorizing.”。何去何从,自己把握。
8 [/ ^/ S, x" p6 d$ t
4 H7 T1 Q9 w. h l, Hb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
/ e0 M8 f9 V. d' [( F行循环次数少的,% {7 s. `0 v( x
内环执行循环次数多的。这样可以显著提高速度。
: \; B$ c! Q( b; |, p2 ?2 T
6 |6 b4 @5 S; T2 U: F2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
+ l A. Z# m* _3 M2 res、cell、struct、/ d5 S* u! e- [5 D% c% j( O
repmat等。
: A- c( H& Z+ F8 v! Mb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:# [- K0 l4 Z5 x. d1 B9 B
( ^# J# A) P1 D" d- p) L5 b! ]1 m
A = int8(zeros(100));! [. g% W1 k- t6 q/ D, n
换成:; ~) o6 t+ W/ }9 K' c5 e9 b
A = repmat(int8(0), 100, 100);% a' p6 b3 \6 R3 O! p: Y# k
c、当需要扩充一个变量的大小、维数时使用repmat函数。
( V6 r7 V: p4 B" l. D- C, } y: `+ F) h' ^: o# _2 |/ i
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
" r( s2 [! U. P& v. C/ W) cb、使用Functions而不是Scripts 。
! S+ y. C" z' Y8 F) a- X% v8 m3 U3 ?7 ]- F% L6 d7 P( ^. }
7 z& m8 B2 _+ A4 _/ Y9 Z, _$ X9 Q+ K
三、 绝招
3 @. V! J* _+ j4 `/ B$ `4 ?# m% C( g I
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
% Y6 b& C; r( q1、改用更有效的算法
3 {. Z0 \/ `; D. X; v7 @2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
1 M& `$ @" u% C: ?- O* n' u# b
' k- _& w* m1 T$ o2 D0 T5 Q关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
: R! m/ ?/ } i g语言文件,VC编译”。
2 M7 ?/ H; N N5 v1 M6 }4 v# K9 B |