在爬蟲處理驗證碼的過程中接觸到矩陣卷積運算,關於該類運算,記錄一下自己的心得。
理論知識
在講述卷積過程前,我們來了解一下卷積公式。根據離散二維卷積公式:
其中a為被卷積矩陣,k為卷積核,b為卷積結果,該公式中,三個矩陣的排序均從0開始。
現在對於上面卷積過程進行分析:我們用來做例子的 a 矩陣為 m×m(3×3)二維矩陣(被卷積矩陣),k 為 n×n(2×2)的二維矩陣(卷積核)。
卷積核 k 矩陣翻轉 180°,得到:
被卷積矩陣擴充套件到(m+n)×(m+n)大小,將擴充套件部分用 0 代替,將卷積核 k 從左上角順序地行移動,再換行,繼續,直到抵達右下角。將對應元素相乘後相加。
依次類推,剔除為 0 的元素,5×5 矩陣結果為 4×4 矩陣,卷積計算結束。
實際應用
關於卷積計算,在 python 中存在於 scipy 的 signal 模組,這裡需要介紹一下 scipy.signal.convolve2d 函式。
scipy.signal.convolve2d(in1,in2,mode ='full',boundary ='fill',fillvalue = 0 )
from scipy import signal
import numpy as np
x = np.array([[1, 2],
[3, 4]])
b =
a =
for i in range(1,10):
if i%3 == 0:
a =
continue
else:
print(np.array(b))
h = np.array(b)
print(signal.convolve2d(h, x, mode='same'))
print(signal.convolve2d(h, x, mode='full'))
print(signal.convolve2d(h, x, mode='valid'))
輸出結果為:
[[ 1 4 7]
[ 7 23 33]
[19 53 63]]
[[ 1 4 7 6]
[ 7 23 33 24]
[19 53 63 42]
[21 52 59 36]]
[[23 33]
[53 63]]
結合程式與分析,被卷積矩陣(m×m)和卷積核(n×n)做卷積運算時,當 scipy.signal.convolve2d 函式中 mode 引數值為 full(預設值)時,得到是完全卷積結果;當 mode 引數值為 valid 時,輸出計算過程中沒有擴充的 0 參與計算的值;當 mode 引數值為 same 時,輸出與被卷積矩陣大小相同的矩陣,按照我的理解是,當卷積結果矩陣的大小(m+n -1)為偶數時,same 輸出的矩陣從左上角按照 m 大小擷取。當卷積結果矩陣的大小(m+n -1)為奇數時,same 輸出的矩陣從正中間擷取大小為 m d的矩陣。
注意:假如被卷積矩陣(3×3)和卷積核(3×3)做卷積運算時,6×6 矩陣擴充時,擴充結果如下:
卷積的運算過程及matlab實現
卷積是訊號處理領域最為常見的運算,對於乙個線性時不變系統而言,只要知道了系統的單位衝擊響應,則可以由輸入序列x n 和單位衝擊響應h n 經卷積運算得到系統的輸出。下面給出輸入訊號x 1 2 3 4 單位衝擊響應h 2 1 1 時,系統輸出的運算過程,雖然matlab自帶了卷積函式conv,但是通過...
矩陣乘法次數的計算過程
矩陣乘法次數的計算 以兩個矩陣相乘為例,a1xa2,a1和a2為兩個矩陣,假設a1的行列數是pxq,a2的行列數是qxr。那麼對於a1xa2而言,我們需要分別執行pxr次對應a1的行元素乘以a2的列元素,根據線性代數知識,可以得到一共需要執行pxqxr次乘法。對於兩個矩陣相乘,一旦矩陣的大小確定下來...
遺傳演算法的運算過程
遺傳演算法 genetic algorithm 是一類借鑑生物界的進化規律 適者生存,優勝劣汰遺傳機制 演化而來的隨機化搜尋方法。它是由美國的j.holland教授1975年首先提出,其主要特點是直接對結構物件進行操作,不存在求導和函式連續性的限定 具有內在的隱並行性和更好的全域性尋優能力 採用概率...