如果有人問你何為一個(gè)好的Matlab程序?你是不是會(huì)說耗時(shí)少、消耗內(nèi)存小、可讀性高、可靠性強(qiáng),可移植/維護(hù)/拓展等等。那么,你最在意是哪條呢?
通常Matlab程序并不是最終產(chǎn)品,僅是產(chǎn)品開發(fā)流程中的一個(gè)中間驗(yàn)證環(huán)節(jié),不需要直接面向廣大消費(fèi)者。此時(shí),你通常會(huì)不注重Matlab對(duì)內(nèi)存的消耗,直接使用其默認(rèn)的占八個(gè)字節(jié)的雙精度數(shù)據(jù)類型。如果編程時(shí)遇到內(nèi)存消耗和耗時(shí)出現(xiàn)沖突時(shí),你還會(huì)以付出內(nèi)存為代價(jià)來減少仿真時(shí)間。
開發(fā)效率屬于高效編程的范疇,如果你是為了驗(yàn)證一個(gè)問題而臨時(shí)編程,以后不會(huì)再用的話,就沒必要耗費(fèi)過多的精力在高效編程上。但是,如果Matlab仿真耗時(shí)的多少會(huì)嚴(yán)重影響到整個(gè)產(chǎn)品的開發(fā)進(jìn)度,那么減少仿真時(shí)間就十分必要了。
今天,我們將和大家聊一聊在兼顧其他優(yōu)良編程習(xí)慣的同時(shí)可以在減少M(fèi)atlab仿真耗時(shí)上的“小常識(shí)”。在探討之前,我們首先要知道如何評(píng)估一段程序仿真需要的時(shí)間。
評(píng)估運(yùn)行時(shí)間的方法最簡(jiǎn)單的方法就是在你需要計(jì)算的代碼前加tic,在代碼后加toc,測(cè)算tic和toc之間代碼的耗時(shí)。但是,如果你需要詳細(xì)統(tǒng)計(jì)程序中每個(gè)函數(shù)的耗時(shí),那么你還可以采用profile工具來評(píng)估。
數(shù)據(jù)類型的選擇在大多數(shù)情況下,Matlab數(shù)據(jù)類型為占用8個(gè)字節(jié)的雙精度型,這除了會(huì)占用較多內(nèi)存,還可能拖慢程序的運(yùn)行速度。其實(shí)常用的數(shù)據(jù)類型除了數(shù)值型,還有邏輯型(logical)、字符型(char)、結(jié)構(gòu)體型(struct)等等。數(shù)值型包括整型、單精度型和雙精度型,整型又可分成多種。
不同的數(shù)據(jù)類型在存儲(chǔ)和訪問效率上各不相同,選擇合適的數(shù)據(jù)類型除了可以節(jié)省內(nèi)存空間,還可以提升運(yùn)行速度。另外,某一個(gè)變量在改變數(shù)據(jù)類型時(shí)會(huì)消耗額外的時(shí)間,因此還不如重新建一個(gè)新變量。
預(yù)分配內(nèi)存我們知道Matlab可以在不定義變量時(shí)可以直接賦值,這種規(guī)則給我們帶來了方便,但同時(shí)也帶來了一些容易被忽視的問題。在循環(huán)體中,如果沒有預(yù)先為某一矩陣分配內(nèi)存空間,而該矩陣會(huì)隨著循環(huán)變化,那么它將在每次循環(huán)時(shí)都浪費(fèi)額外的時(shí)間去尋找滿足需求的內(nèi)存空間,將改變大小后的矩陣整體移動(dòng)到這個(gè)新的內(nèi)容空間中,并釋放原來的內(nèi)存空間,這除了會(huì)影響代碼的運(yùn)行效率,還容易形成內(nèi)存碎片,讓程序越來越難找到滿足條件的內(nèi)存。
因此在循環(huán)前給矩陣預(yù)分配內(nèi)存是很一個(gè)良好的習(xí)慣,如果沒有這個(gè)習(xí)慣,你還可以通過Matlab自帶的代碼檢查器來查看是否存在類似問題。
列優(yōu)先在Matlab中矩陣的存儲(chǔ)是按列優(yōu)先的,并且下標(biāo)是從1開始的,這二點(diǎn)是與C++是不同的,需要初學(xué)者稍加注意。對(duì)于矩陣的操作,可以通過下標(biāo)索引,也可以通過線性索引來訪問元素,由于Matlab是按列優(yōu)先存儲(chǔ)的,則其線性索引是按列遞增的。如果處理時(shí)按列操作會(huì)比按行操作提升程序的運(yùn)行效率哦。
向量化編程代替“循環(huán)”矩陣運(yùn)算是Matlab的優(yōu)勢(shì),因此能用矩陣就少用循環(huán)吧,即使Matlab對(duì)循環(huán)引入了加速技術(shù)JIT和accelerator。當(dāng)然也不需要一味的追求矩陣運(yùn)算,循環(huán)可以用,但需要考慮循環(huán)體內(nèi)的代碼執(zhí)行方式。例如循環(huán)次數(shù)多的盡量在內(nèi)層,少的在外層,每次循環(huán)做較多的數(shù)據(jù)處理,盡量減少循環(huán)次數(shù)。
Matlab在矩陣運(yùn)算中極為快速,是因?yàn)槠涞讓诱{(diào)用了BLAS庫和LAPACK庫。LAPACK是高性能線性代數(shù)計(jì)算庫,用于求解科學(xué)與工程計(jì)算中常見的線性代數(shù)問題,例如矩陣乘法、線性最小二乘問題、特征值問題等。BLAS庫是基礎(chǔ)線性代數(shù)程序集。
并行編程并行處理大家并不陌生,這個(gè)將在后面重點(diǎn)介紹,今天就不展開了。
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由信途科技轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系站長刪除。
轉(zhuǎn)載請(qǐng)注明出處http://www.quickersubmitter.com/xintu/13166.html