Как я могу сгенерировать матрицу теплица в правильной форме для выполнения дискретной свертки?


Дискретная свертка может быть выполнена с помощью матрицы теплица, как показано ниже (Статья Wiki):

Введите описание изображения здесь

Обратите внимание, что это не та же самая форма, что и общая Матрица теплица, но она испытала различные сдвиги и нуль-дополнения.

Есть ли способ, чтобы достичь этого в пакете numpy основывается исключительно на roll, hstack и т. д., то есть без использования каких-либо for петель? Я пробовал все виды сдвигов, но я не могу действительно получить его в форме показано выше.

1 2

1 ответ:

Да, вы можете использовать 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]])