優(yōu)化MATLAB程序的技巧.doc_第1頁
優(yōu)化MATLAB程序的技巧.doc_第2頁
優(yōu)化MATLAB程序的技巧.doc_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

優(yōu)化MATLAB程序的技巧 已有 76 次閱讀2012-10-19 22:57|個人分類:MATLAB|系統(tǒng)分類:科研筆記|關(guān)鍵詞:的 學(xué)習(xí) 技巧其實(shí)是轉(zhuǎn)載的,轉(zhuǎn)載地址是:/s/blog_62983bd50100fyvn.html但是直接轉(zhuǎn)載沒法進(jìn)行學(xué)習(xí)筆記的標(biāo)注,因此現(xiàn)在拷貝到這里進(jìn)行學(xué)習(xí)。原文內(nèi)容如下:這是薛定宇老師的建議,原文在大觀園的首頁:因?yàn)?MATLAB 語言是一種解釋性語言,所以有時 MATLAB 程序的執(zhí)行速度不是很理想。這里將依照作者十多年的實(shí)際編程經(jīng)驗(yàn)給出加快 MATLAB程序執(zhí)行速度的一些建議和體會。要點(diǎn)1:盡量避免使用循環(huán):循環(huán)語句及循環(huán)體經(jīng)常被認(rèn)為是MATLAB 編程的瓶頸問題。改進(jìn)這樣的狀況有兩種方法:(1) 盡量用向量化的運(yùn)算來代替循環(huán)操作。我們將通過如下的例子來演示如何將一般的循環(huán)結(jié)構(gòu)轉(zhuǎn)換成向量化的語句。例3.19考慮下面無窮級數(shù)求和問題:如果我們只求出其中前有限項,比如 100,000 項之和 (要精確地求出級數(shù)的和,無需求 100000 項,幾十項往往就能得出滿意的精度。這里主要是為了演示循環(huán)運(yùn)算向量化的優(yōu)越性。),則可以采用下面的常規(guī)語句進(jìn)行計算 tic;s=0;for i=1:100000s=s+(1/2i+1/3i); end tocs =1.5000elapsed_time =1.9700如果采用向量化的方法,則可以得出下面結(jié)果??梢钥闯?,采取向量化的方法比常規(guī)循環(huán)運(yùn)算效率要高得多。 tic;i=1:100000; s=sum(1./2.i+1./3.i);toc;s =1.5000elapsed_time =0.3800(2)在必須使用多重循環(huán)的情況下,如果兩個循環(huán)執(zhí)行的次數(shù)不同,則建議在循環(huán)的外循環(huán)執(zhí)行循環(huán)次數(shù)少的,內(nèi)環(huán)執(zhí)行循環(huán)次數(shù)多的。這樣也可以顯著提高速度。例3.20考慮生成一個 5x10000 的 Hilbert 長方矩陣,該矩陣的定義是其第 i 行第 j 列元素為 h(i,j)=1/(i+j-1)。我們可以由下面語句比較先進(jìn)行 i=1:5 的循環(huán)和后進(jìn)行該循環(huán)的耗時區(qū)別,其效果和前面分析的是一致的。 ticfor i=1:5 %外側(cè)為循環(huán)次數(shù)少的循環(huán)for j=1:10000H(i,j)=1/(i+j-1);endendTocelapsed_time =8.6800ticfor j=1:10000 %外側(cè)為循環(huán)次數(shù)多的循環(huán)for i=1:5J(i,j)=1/(i+j-1);endendtocelapsed_time =25.7000要點(diǎn)2:大型矩陣的預(yù)先定維給大型矩陣動態(tài)地定維是個很費(fèi)時間的事。建議在定義大矩陣時,首先用 MATLAB 的內(nèi)在函數(shù),如zeros() 或 ones() 對之先進(jìn)行定維,然后再進(jìn)行賦值處理,這樣會顯著減少所需的時間的。再考慮例3-20中的問題,如果輸入下面的命令 ticH=zeros(5,10000);for i=1:5for j=1:10000H(i,j)=1/(i+j-1);endendTocelapsed_time =1.0400則采用預(yù)先定維的方法,再結(jié)合向量化的方法,我們可以給出下面的 MATLAB 語句。 ticH=zeros(5,10000); %余弦定維的方法for i=1:5 %向量化的方法H(i,=1./i:i+9999;endTocelapsed_time =0.060可見,預(yù)先定維后,所需要的時間顯著地減少了??梢钥闯?,同樣一個問題,由于采用了有效的措施,所需的時間就可以從 25.7 秒減少到 0.06 秒,亦即效率提高了 428 倍。對二重循環(huán)這樣的特殊問題,我們還可以使用 meshgrid() 函數(shù)構(gòu)造兩個 5x10000 矩陣 i 和 j,從而直接得出 H 矩陣,更進(jìn)一步地加快速度。 tici,j=meshgrid(1:5,1:10000); H=1./(i+j-1); Tocelapsed_time =0要點(diǎn)3:優(yōu)先考慮內(nèi)在函數(shù)矩陣運(yùn)算應(yīng)該盡量采用 MATLAB的內(nèi)在函數(shù),因?yàn)閮?nèi)在函數(shù)是由更底層的編程語言C構(gòu)造的,其執(zhí)行速度顯然快于使用循環(huán)的矩陣運(yùn)算。要點(diǎn)4:采用有效的算法在實(shí)際應(yīng)用中,解決同樣的數(shù)學(xué)問題經(jīng)常有各種各樣的算法。例如求解定積分的數(shù)值解法在 MATLAB:中就提供了兩個函數(shù)quad()和quad8(),其中后一個算法在精度、速度上都明顯高于前一種方法。所以說,在科學(xué)計算領(lǐng)域是存在“多快好省”的途徑的。如果一個方法不能滿足要求,可以嘗試其他的方法。要點(diǎn)5應(yīng)用 Mex 技術(shù)雖然采用了很多措施,但執(zhí)行速度仍然很慢,比如說耗時的循環(huán)是不可避免的,這樣就應(yīng)該考慮用其他語言,如 C 或 Fortran 語言。按照 Mex 技術(shù)要求的格式編寫相應(yīng)部分的程序,然后通過編譯聯(lián)接,形成在 MATLAB 可以直接調(diào)用的動態(tài)連接庫 (DLL) 文件,這樣可以顯著地加快運(yùn)算速度。要點(diǎn)6函數(shù)比腳本運(yùn)行更快這是因?yàn)? M

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論