數字影象處理MATLAB—向量化迴圈—預分配陣列
阿新 • • 發佈:2019-01-30
優化MATLAB程式碼方法
數字影象處理中:
MATLAB是一種專門為陣列運算而設計的程式語言。
這裡討論兩種優化MATLAB程式碼方法。
1. 向量化迴圈:
MATLAB會自動處理索引h。當座標中涉及0時,會有混亂之源,因為本書和手冊中反覆強調MATLAB陣列不能有0索引。
import time
import numpy as np
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time() #開始計時
c = np.dot(a,b) #對a,b 做點積
toc = time.time () #計時結束
print(c)
print("Vectorized version(向量化迴圈): " , str(1000*(toc-tic)) + "ms")
c = 0
tic1 = time.time()
for i in range(1000000):
c += a[i]*b[i]
toc1 = time.time()
print(c)
print("For loop version(一般for迴圈): " , str(1000*(toc1-tic1)) + "ms")
當時處理小資料量時,速度快倍
處理百萬資料,耗時相差400多倍。
2.預分配陣列
加快程式碼執行時間的另一種方法是在程式中預分配陣列的大小。在處理數值或邏輯陣列時,預分配只是簡單地建立有著適當維數的陣列,陣列的元素均為0。例如,若我們正在處理兩幅大小均為〖024x1024畫素的影象f和g,則預分配由如下語句構成:
大處理大陣列時,預分配也可幫助我們減少儲存器碎片。動態儲存器的分配和去分配會使得儲存器出現碎片。實際的結果是在計算過程中可能會有足夠空間的可用物理儲存器,但可能沒有足夠的連續空間來容納一個較大的變董。預分配通過在計算開始時就允許MATLAB為大資料構造保留足夠的儲存空間,來阻止無連續空間的情形出現。