用過Matlab的人都知道,Matlab是一種解釋性語言,存在計(jì)算速度慢的問題,為了提高程序的運(yùn)行效率,matlab提供了多種實(shí)用工具及編碼技巧。 fUC9-?(K
+R-h ,$\=7
1. 循環(huán)矢量化 d1v<DU>M
opsQn\4DZ?
Matlab是為矢量和矩陣操作而設(shè)計(jì)的,因此,可以通過矢量化方法加速M(fèi)文件的運(yùn)行。矢量化是指將for循環(huán)和while循環(huán)轉(zhuǎn)換為等價(jià)的矢量或矩陣操作。下面給出一個(gè)循環(huán)的例子: z{S:X:X
t\h$&[[l'z
i=0; sI_7U^"[
lT2 4JhJ#
for n = 0:0.1:1000 X1+wX`f
I>PZYh'.T
i=i+1; TZ[Zm
1y
J5l,q
y(i)=cos(n); xwRhs!`t1
=#qZ3 Qz_
end ~q)u(WC|
HPrq1QpK
那么我們可以矢量化為: k<a;[_S
v??TJ^1
n= 0:0.1:1000; u*3NS$vH
0RUi\X4HI
y=cos(n); )qL&%xz
'+j<n[JLC
我們可以用tic和toc函數(shù)來查看上述各代碼運(yùn)行的時(shí)間,采用for循環(huán)的程序0.39秒(具體時(shí)間和計(jì)算機(jī)配置有關(guān)),而矢量化后幾乎耗時(shí)為0。 !/`$AXO
cHx%Nd\
2. 給數(shù)組或矩陣預(yù)分配內(nèi)存 nVE9^')8V
0Vkl`DmeM.
特別是使用大型數(shù)組或矩陣時(shí),Matlab進(jìn)行動(dòng)態(tài)內(nèi)存分配和取消時(shí),可能會產(chǎn)生內(nèi)存碎片,這將導(dǎo)致大量閑置內(nèi)存產(chǎn)生,預(yù)分配可通過提前給大型數(shù)據(jù)結(jié)構(gòu)預(yù)約足夠空間來避免這個(gè)問題。 9'?se5\
v,=v
3. 用函數(shù)代替腳本文件 G8nrdN-9
IOL L1ar
因?yàn)槊看握{(diào)用MATLAB的腳本文件都需要將不必要的中間變量加載到內(nèi)存中,每執(zhí)行一次,就加載一次。函數(shù)在調(diào)用時(shí)被編譯成了偽代碼,只需要加載到內(nèi)存一次。當(dāng)多次調(diào)用同一個(gè)函數(shù)時(shí)會運(yùn)行快一些。因此盡量多使用函數(shù)文件而少使用腳本文件,也是提高執(zhí)行效率的一種方法。 UiH!Dl}<
A4.4Dji,x
4. 用Mex文件編寫循環(huán)代碼 -(i(02PX
=-NiO@5o
Matlab提供了與C和C++的接口,那么我們可以在用C或C++語言編寫耗時(shí)的循環(huán)代碼,然后通過接口程序在Matlab中轉(zhuǎn)換成dll文件,這就是我們所要的Mex文件,通過這種方法可以極大地提高計(jì)算速率。