如何生成正确形式的 Toeplitz 矩阵以执行离散卷积?
How can I generate a Toeplitz matrix in the correct form for performing discrete convolution?
离散卷积可以通过Toeplitz矩阵进行,如下图(Wiki article):
请注意,这与一般托普利茨矩阵的形式不完全相同,但它经历了各种移位和零填充。
有没有办法在完全基于 roll
、hstack
等的 numpy 中实现这一点,即不使用任何 for
循环?我已经尝试了各种转变,但我无法真正将其转换为上面显示的形式。
是的,您可以使用 scipy.linalg.toeplitz
:
import numpy as np
from scipy import linalg
h = np.arange(1, 6)
padding = np.zeros(h.shape[0] - 1, h.dtype)
first_col = np.r_[h, padding]
first_row = np.r_[h[0], padding]
H = linalg.toeplitz(first_col, first_row)
print(repr(H))
# array([[1, 0, 0, 0, 0],
# [2, 1, 0, 0, 0],
# [3, 2, 1, 0, 0],
# [4, 3, 2, 1, 0],
# [5, 4, 3, 2, 1],
# [0, 5, 4, 3, 2],
# [0, 0, 5, 4, 3],
# [0, 0, 0, 5, 4],
# [0, 0, 0, 0, 5]])
离散卷积可以通过Toeplitz矩阵进行,如下图(Wiki article):
请注意,这与一般托普利茨矩阵的形式不完全相同,但它经历了各种移位和零填充。
有没有办法在完全基于 roll
、hstack
等的 numpy 中实现这一点,即不使用任何 for
循环?我已经尝试了各种转变,但我无法真正将其转换为上面显示的形式。
是的,您可以使用 scipy.linalg.toeplitz
:
import numpy as np
from scipy import linalg
h = np.arange(1, 6)
padding = np.zeros(h.shape[0] - 1, h.dtype)
first_col = np.r_[h, padding]
first_row = np.r_[h[0], padding]
H = linalg.toeplitz(first_col, first_row)
print(repr(H))
# array([[1, 0, 0, 0, 0],
# [2, 1, 0, 0, 0],
# [3, 2, 1, 0, 0],
# [4, 3, 2, 1, 0],
# [5, 4, 3, 2, 1],
# [0, 5, 4, 3, 2],
# [0, 0, 5, 4, 3],
# [0, 0, 0, 5, 4],
# [0, 0, 0, 0, 5]])