|
非常实用的Matlab编程技巧。可以试一试。
0 M8 l% E) ~2 ^; fCTerm下载文章: 紫丁香★( ]$ e/ `& p1 g6 } h4 a' X' f
7 o; m7 `, F) S发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
: `7 z# W v5 _标 题: 加速matlab运行的三重境界0 q8 U& w; K& D7 M
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004). W% j* ^1 f/ O9 l! e4 R4 p
- _: e+ a0 g/ X3 f0 @+ @# G加速matlab运行的三重境界/ }! o7 e$ y7 N' U) W$ B
一、 遵守Performance Acceleration的规则
, e, l6 m1 a. X& r0 a# R5 f! F二、 遵守三条规则7 ^4 ]% ~; z k
三、 绝招
/ h% U3 H; u1 _" V. U
一、 遵守Performance Acceleration的规则! Z5 Z3 q" H! A# k
5 A4 m; Y# v1 Y- U( z关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
1 N, _; _& Y9 [ A8 V其规则总结如下7条:6 Y$ E9 g" X1 i1 \9 S9 W' ]' I9 h, C9 L
1、只有使用以下数据类型,matlab才会对其加速:
9 v! E6 P7 h ylogical,char,int8,uint8,int16,uint16,int32,uint32,double1 w% } D9 G9 ?9 h1 X( H2 E0 n- A
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu9 T2 ]! f6 S8 y
re,single,6 ]; T* c3 _9 |
! P+ B) d2 g2 s& |+ `
function handle,java classes,user classes,int64,uint640 Y; H: T" [1 _! N. W L% k3 F
2、matlab不会对超过三维的数组进行加速。) u# T% C' }* `
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值9 { |4 U0 x+ C1 R
来表示;
# h& `! c; I# e$ z: C' wb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
6 J. v3 z" [' A, W8 `' i, ^" L据类型,只使用- D" L' D- [2 _8 g) h- g
三维以下的数组;c、循环内只调用了内建函数(build-in function)。8 e8 Y! J3 h r& B8 A6 c, n4 E& v
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将. O% E! F1 ~! Q; q F& w5 W2 j& L
加速运行。7 p, ^9 x" ~2 e6 H, N0 {
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:# [5 ~6 E0 G l6 {" w9 f5 l' ^. Q2 L
x = a.name; for k=1:10000, sin(A(k)), end;
1 Y2 o6 o' t" f/ v* `6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速" ?- z$ U' z, D# h; i2 u0 v
度。5 A: P! L, p8 G+ C
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低$ V& Z% E3 c7 u8 X* y9 q( b& X# p
运行速度。
' T) Z% G5 D7 ]6 W: C) Y. S4 H& t& Q9 }! `
/ @4 H5 T4 w4 J, [ I( B
二、 遵守三条规则2 I$ i7 s9 W1 T& N. e6 F
& ]3 b$ L* s6 [" {; g% J. `( ^8 H1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
. R R( r1 k r( Q1 {1 eh means it is designed/ z- H R+ i2 K. H: i" X
: d# r) q4 T# I. i# t
for vector and matrix operations. You can often speed up your M-file c
9 c" B, A1 G1 W& X* K4 T& M6 h0 k7 vode by using
+ l8 R" f3 O' f" f4 e7 a. }vectorizing algorithms that take advantage of this design. Vectorizati) z: R% S, v! k6 S
on means converting
; |8 ~" j0 A' B- pfor and while loops to equivalent vector or matrix operations.”。改进
/ K; T' h' C; U3 H" G3 a. Z. ~这样的状况有两种方法:
5 `) \3 X4 [' k! a: b9 h1 [) u* [( f0 T; H+ k+ X; N
a、尽量用向量化的运算来代替循环操作。如将下面的程序:) u; S) e+ M( K
& Z8 t- i0 @5 b" c8 d gi=0;
- U7 A# Q& Y5 m2 W( l$ ]5 i1 k+ {for t = 0:.01:100 G9 `- w, u# J3 ]6 f* l/ L
i = i+1;5 i3 Y3 `1 I5 z ]6 q
y(i) = sin(t);
. `" s2 a& {1 ^6 hend
& C4 U$ R6 N. q( j/ P9 t3 n( W9 h替换为:3 O& M2 N, D% R
t = 0:.01:10;1 y% G6 Y+ T1 l* a
y = sin(t);, T* f( b7 r. H0 i
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i) f( E, g7 h7 O8 z
permute、permute、, e- P2 ^& T2 ~' H0 g z
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
# y' D! D- o$ `. {) G6 uum、ind2sub、
) v/ m( b9 I. S5 L2 L. mndgrid、repmat、sort、sum 等。
- V4 V4 A \: o5 b2 x5 o4 B. _& M. K' _% o% i
请注意matlan文档中还有这样一句补充:“Before taking the time to( o- U9 x& S) N3 m
; U9 o& Y8 R( X7 R, ~. V2 Pvectorize your code, read the section on Performance Acceleration.
, Y3 i( }5 | D4 JYou may be able to; ~; q" U( n8 K' |' @2 }0 ~
speed up your program by just as much using the MATLAB JIT Accelera
% b: o# S. E- b, {" `; X4 e8 Ntor instead of
$ T0 v/ w" V% r4 ?: x; \! Jvectorizing.”。何去何从,自己把握。: [& T7 G" i4 x5 l) @+ h/ X
" |! Z. E8 R& g# I
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执7 U% e4 l I$ {" }5 U. o# M+ N
行循环次数少的,
6 a6 v8 H4 X/ m `内环执行循环次数多的。这样可以显著提高速度。6 i! s& s0 O0 }: h ?% Q
) t( Q# X: w( W5 s
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on9 D, r n3 m1 c+ {1 v
es、cell、struct、6 p9 U0 h- P/ x1 @) D
repmat等。! L! c/ c% M3 `8 [1 s8 F
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
. |4 W( d5 G4 s" c7 R# ]& X# Y7 ^6 {: p+ C2 U0 W
A = int8(zeros(100)); y3 w$ k) e0 @* c2 r# I
换成:
* }' ]# I: H3 w0 W1 L4 YA = repmat(int8(0), 100, 100);
9 E! b& y7 f! F0 W& pc、当需要扩充一个变量的大小、维数时使用repmat函数。4 h6 a. R: E: ~5 y
/ r2 O( |8 v+ T' h8 p3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
& y& p( ~9 ?; A- V9 ~2 W% Q Rb、使用Functions而不是Scripts 。
4 w/ I- k& d: ^9 ~% Y! Q7 G" \. K% K. {) e/ D
; x$ `; l- ]7 z+ g3 m. ?; w三、 绝招7 D r# M7 z# q! {1 V. n5 }
8 D/ U& a) h, H
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。$ M( I E$ `$ M; V& v7 f
1、改用更有效的算法7 x( G* P# N4 z* @5 q+ Z( _4 I! j- H% B
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
. a+ f# Y, I' U h! j
$ h) w \2 O5 ]关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++; y' w' B4 K' h7 P
语言文件,VC编译”。 3 u" d/ n% s6 [* `
|