scipy.linalg.

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]])