用過Matlab的人都知道,Matlab是一種解釋性語言,存在計算速度慢的問題,為了提高程序的運行效率,matlab提供了多種實用工具及編碼技巧。 Ax<\jW<
&0v.E"0<
1. 循環(huán)矢量化 d53 L65[
w:ULi3
Matlab是為矢量和矩陣操作而設(shè)計的,因此,可以通過矢量化方法加速M文件的運行。矢量化是指將for循環(huán)和while循環(huán)轉(zhuǎn)換為等價的矢量或矩陣操作。下面給出一個循環(huán)的例子: FJS'G^
XGs^rIf
i=0; KSqTY>%fnv
UpUp8%fCU
for n = 0:0.1:1000 Ewo~9
4{
cCdX0@hY
i=i+1; 4zc<GL3[
a/:XXy |
y(i)=cos(n); m *X7T
WS0JS'
end Ex(3D[WmMW
;Ss$2V'a
那么我們可以矢量化為: jX
*/piSq
;4~U,+Av
n= 0:0.1:1000; nkY@_N
;+_8&wbqW
y=cos(n); 3fkk
[U
PEXq:TA
我們可以用tic和toc函數(shù)來查看上述各代碼運行的時間,采用for循環(huán)的程序0.39秒(具體時間和計算機配置有關(guān)),而矢量化后幾乎耗時為0。 SN">gmY+
8b&uU [
2. 給數(shù)組或矩陣預(yù)分配內(nèi)存 l I-p_K
xAdq+$><
特別是使用大型數(shù)組或矩陣時,Matlab進行動態(tài)內(nèi)存分配和取消時,可能會產(chǎn)生內(nèi)存碎片,這將導(dǎo)致大量閑置內(nèi)存產(chǎn)生,預(yù)分配可通過提前給大型數(shù)據(jù)結(jié)構(gòu)預(yù)約足夠空間來避免這個問題。 ]qktj=p
k`YYZt]@
3. 用函數(shù)代替腳本文件 W)=%mdxW0
q~Jq/E"f
因為每次調(diào)用MATLAB的腳本文件都需要將不必要的中間變量加載到內(nèi)存中,每執(zhí)行一次,就加載一次。函數(shù)在調(diào)用時被編譯成了偽代碼,只需要加載到內(nèi)存一次。當(dāng)多次調(diào)用同一個函數(shù)時會運行快一些。因此盡量多使用函數(shù)文件而少使用腳本文件,也是提高執(zhí)行效率的一種方法。 Px;Cg
6
l[Z)@bC1
4. 用Mex文件編寫循環(huán)代碼 9O98Q6-s
wyY*:{lZ
Matlab提供了與C和C++的接口,那么我們可以在用C或C++語言編寫耗時的循環(huán)代碼,然后通過接口程序在Matlab中轉(zhuǎn)換成dll文件,這就是我們所要的Mex文件,通過這種方法可以極大地提高計算速率。