1. 程式人生 > >數字影象處理MATLAB—向量化迴圈—預分配陣列

數字影象處理MATLAB—向量化迴圈—預分配陣列

優化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為大資料構造保留足夠的儲存空間,來阻止無連續空間的情形出現。