|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab7 v. P* |6 R: A0 t: k
标 题: 加速matlab运行的三重境界
" c2 l6 [7 B" t发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)2 l: d- ]1 n3 a# \7 j/ B
( Z6 W5 c6 K d- K5 [, L1 V0 E7 z
加速matlab运行的三重境界 . `. @6 ]5 A c1 h) M
2 Z% q' W( A4 c' ? |9 \一、 遵守Performance Acceleration的规则4 d, V* T. s/ g' v* y1 p
2 ~6 V! w5 t. D; Q, X9 q6 I w D
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将7 w/ ~ N7 N; o( n$ X6 D3 _$ J' j l
其规则总结如下7条:
% ?- l' K, \4 Q7 f1、只有使用以下数据类型,matlab才会对其加速:
4 n/ g& f' P$ L! g. Flogical,char,int8,uint8,int16,uint16,int32,uint32,double" }4 k1 g1 a3 K
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu( Z5 b% B& P, m# X' J
re,single,
% H; u8 I% S5 E0 H; S6 h' H7 g$ X" \/ G7 Y
function handle,java classes,user classes,int64,uint64" h" M' I9 @5 G: `* [3 E
2、matlab不会对超过三维的数组进行加速。, \ @* o. \0 P; m6 ^
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值& `3 ]8 |9 a+ c, Q" g# O
来表示;
7 Z. X) |6 Y7 Eb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
. r) Q# P4 i4 n7 Y4 }; Q- k" t' x据类型,只使用
. d9 _8 \- R% X5 j6 P三维以下的数组;c、循环内只调用了内建函数(build-in function)。
) R7 V/ g" e7 r+ |! {4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将* d+ T0 P( ~% B/ m4 b$ |# z; O
加速运行。9 n4 {8 n) e% N X
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:6 M' l `5 n+ q9 h! ~( N; I/ v5 l0 i* S
x = a.name; for k=1:10000, sin(A(k)), end;
2 S+ a5 e) S' f, ~0 I6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速3 c6 Y: ?2 e# ]/ w8 B4 I( R
度。6 s* k. o. x6 {* D
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
( t! U( V4 _' J9 K9 [ T运行速度。" k+ x6 z- j7 {
8 A4 Z; Q' N( ^! o# k- X
二、 遵守三条规则4 {# q ^ t9 \5 S% J5 i: U H3 P
$ ~. W- J* {4 U3 i; h" }1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
- {: \5 h6 y4 N3 Uh means it is designed
; G# K# U" @) m" o5 `7 f1 d5 H; T1 Q" ^2 v
for vector and matrix operations. You can often speed up your M-file c! Z. F% E( g0 n% h5 b9 D
ode by using
/ x# t/ ? x6 V- K. Q4 ]; D$ [vectorizing algorithms that take advantage of this design. Vectorizati
9 i* q+ M$ H' P& R8 Ion means converting
$ e& b, _ m' G+ j0 Wfor and while loops to equivalent vector or matrix operations.”。改进
9 R3 \+ X8 B% b% k3 B) d这样的状况有两种方法:
/ R0 {. i8 T. f; z2 V2 k+ S) F
; l7 m* x/ s3 ?8 Z. j8 ^a、尽量用向量化的运算来代替循环操作。如将下面的程序:' q6 R; K" J9 V2 x" c
! e; m$ U$ g! C! D* g, L+ C: l. q0 Ji=0;6 _1 V2 V" H4 G9 l
for t = 0:.01:10
" r. u; V, h1 a! i1 yi = i+1;
: u7 y9 A4 P& _4 _y(i) = sin(t);
9 U6 Q, i, } T4 @* Q. Vend, y4 M" \0 o- ^: d0 D
替换为:
, W1 C/ l+ K4 A; h4 L% I6 ~7 Vt = 0:.01:10;( o! u: |5 Z4 f5 f
y = sin(t);* j, p; a# q: X* z
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
# x e5 J+ a' D7 {* b1 tpermute、permute、
8 S! b1 N1 m2 F5 \' \& [6 y" h8 p) Freshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums( e4 Z! I: p. {# ]$ \8 l
um、ind2sub、
$ h: o; s$ W+ L/ ]ndgrid、repmat、sort、sum 等。3 R' r& m. a( k' q- v' @1 g8 m
# v. o/ Z- ^; S7 W" u4 |0 Q; W4 h请注意matlan文档中还有这样一句补充:“Before taking the time to$ `' Z, m& z f
9 P! [9 a7 M2 _+ i" V2 f- |2 [# Y; \
vectorize your code, read the section on Performance Acceleration.
) h7 u. h. S8 ?- z" SYou may be able to
1 b$ v( J5 M/ a: U) b( gspeed up your program by just as much using the MATLAB JIT Accelera6 D! R1 f+ M- _1 I5 {+ w0 S! w- ^
tor instead of- S; J8 s7 f2 b- {2 q, z
vectorizing.”。何去何从,自己把握。
C3 { H+ b5 M( F6 H6 u& |" o% Y$ c
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执: B' s3 p8 `# v) y) U& T/ r
行循环次数少的,
! C& N% Q# f$ z$ o内环执行循环次数多的。这样可以显著提高速度。
4 t* o6 Z$ @5 }. N
: I% S, x; y9 X3 X; b( q2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
# E: O$ h5 I% W4 ]$ aes、cell、struct、
m2 J% F, F0 Z: ~7 p+ v& |" Hrepmat等。
# z, j. f6 \1 [' Cb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:+ u) j0 z: ~6 t+ p" ^! @" F
7 n2 r' j- y) P( P5 c- n) wA = int8(zeros(100));
( w8 S# T* f* ^! P0 A9 ^! a$ I5 F2 O换成:: P% }4 q1 H# C
A = repmat(int8(0), 100, 100);. \& F$ J+ [6 b' M1 ~* S6 A
c、当需要扩充一个变量的大小、维数时使用repmat函数。
7 s3 z& O8 _; D$ @# i+ r3 ^- R9 p& o6 Q7 e
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
1 \0 {; P% ^1 w6 \% F$ D2 R8 Eb、使用Functions而不是Scripts 。) U, K8 y8 t- }+ Z# b
* H4 X' S" q9 L' j1 |( m8 E三、 绝招1 X3 x& _( ?8 L4 z/ g- K+ B0 ?
: o8 z B/ P7 ?' E, L, K
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。% D% k! J$ b9 U$ c5 J9 L
1、改用更有效的算法
* l' }+ A- L2 t8 d5 b& _8 `% c8 m6 z2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。/ Z4 Z+ M; k& x3 k
+ r' G; w; ?9 W1 ~关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
: F! j$ s; U. @" G语言文件,VC编译”。 |