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