convolution_matrix#
- scipy.linalg.convolution_matrix(a, n, mode='full')[原始碼]#
建構卷積矩陣。
建構代表一維卷積的 Toeplitz 矩陣 [1]。詳情請參閱下方註解。
- 參數:
- a(…, m) 類陣列 (array-like)
要進行卷積的一維陣列。N 維陣列會被視為批次處理:沿著最後一個軸的每個切片都是要進行卷積的一維陣列。
- nint
結果矩陣中的欄數。它給出了要與 a 進行卷積的輸入長度。這類似於
numpy.convolve(a, v)
中 v 的長度。- modestr
這類似於
numpy.convolve(v, a, mode)
中的 mode。它必須是 (‘full’, ‘valid’, ‘same’) 其中之一。請參閱下方說明 mode 如何決定結果的形狀。
- 返回:
- A(…, k, n) ndarray
卷積矩陣,其列數 k 取決於 mode
======= ========================= mode k ======= ========================= 'full' m + n -1 'same' max(m, n) 'valid' max(m, n) - min(m, n) + 1 ======= =========================
對於批次輸入,沿著輸出最後兩個維度的每個形狀為
(k, n)
的切片,對應於沿著輸入最後一個維度的形狀為(m,)
的切片。
另請參閱
toeplitz
Toeplitz 矩陣
註解
程式碼
A = convolution_matrix(a, n, mode)
建立一個 Toeplitz 矩陣 A,使得
A @ v
等同於使用convolve(a, v, mode)
。返回的陣列始終具有 n 欄。列數取決於指定的 mode,如上所述。在預設的 ‘full’ 模式下,A 的條目由下式給出
A[i, j] == (a[i-j] if (0 <= (i-j) < m) else 0)
其中
m = len(a)
。例如,假設輸入陣列為[x, y, z]
。卷積矩陣的形式為[x, 0, 0, ..., 0, 0] [y, x, 0, ..., 0, 0] [z, y, x, ..., 0, 0] ... [0, 0, 0, ..., x, 0] [0, 0, 0, ..., y, x] [0, 0, 0, ..., z, y] [0, 0, 0, ..., 0, z]
在 ‘valid’ 模式下,A 的條目由下式給出
A[i, j] == (a[i-j+m-1] if (0 <= (i-j+m-1) < m) else 0)
這對應於一個矩陣,其行是 ‘full’ 情況的子集,其中 a 中的所有係數都包含在行中。對於輸入
[x, y, z]
,此陣列看起來像[z, y, x, 0, 0, ..., 0, 0, 0] [0, z, y, x, 0, ..., 0, 0, 0] [0, 0, z, y, x, ..., 0, 0, 0] ... [0, 0, 0, 0, 0, ..., x, 0, 0] [0, 0, 0, 0, 0, ..., y, x, 0] [0, 0, 0, 0, 0, ..., z, y, x]
在 ‘same’ 模式下,A 的條目由下式給出
d = (m - 1) // 2 A[i, j] == (a[i-j+d] if (0 <= (i-j+d) < m) else 0)
‘same’ 模式的典型應用是當您有一個長度為 n 的訊號(其中 n 大於
len(a)
),並且所需的輸出仍然是長度為 n 的濾波訊號時。對於輸入
[x, y, z]
,此陣列看起來像[y, x, 0, 0, ..., 0, 0, 0] [z, y, x, 0, ..., 0, 0, 0] [0, z, y, x, ..., 0, 0, 0] [0, 0, z, y, ..., 0, 0, 0] ... [0, 0, 0, 0, ..., y, x, 0] [0, 0, 0, 0, ..., z, y, x] [0, 0, 0, 0, ..., 0, z, y]
在 1.5.0 版本中新增。
參考文獻
範例
>>> import numpy as np >>> from scipy.linalg import convolution_matrix >>> A = convolution_matrix([-1, 4, -2], 5, mode='same') >>> A array([[ 4, -1, 0, 0, 0], [-2, 4, -1, 0, 0], [ 0, -2, 4, -1, 0], [ 0, 0, -2, 4, -1], [ 0, 0, 0, -2, 4]])
比較 A 的乘法與
numpy.convolve
的使用。>>> x = np.array([1, 2, 0, -3, 0.5]) >>> A @ x array([ 2. , 6. , -1. , -12.5, 8. ])
驗證
A @ x
產生的結果與套用卷積函數的結果相同。>>> np.convolve([-1, 4, -2], x, mode='same') array([ 2. , 6. , -1. , -12.5, 8. ])
為了與上面顯示的
mode='same'
情況進行比較,以下是針對相同係數和大小,由mode='full'
和mode='valid'
產生的矩陣。>>> convolution_matrix([-1, 4, -2], 5, mode='full') array([[-1, 0, 0, 0, 0], [ 4, -1, 0, 0, 0], [-2, 4, -1, 0, 0], [ 0, -2, 4, -1, 0], [ 0, 0, -2, 4, -1], [ 0, 0, 0, -2, 4], [ 0, 0, 0, 0, -2]])
>>> convolution_matrix([-1, 4, -2], 5, mode='valid') array([[-2, 4, -1, 0, 0], [ 0, -2, 4, -1, 0], [ 0, 0, -2, 4, -1]])