import torch
dim1 = 5
dim2 = dim1
x = torch.randn(dim1, dim2).reshape(1, -1)
kernel = torch.arange(0, 9).reshape(3, 3)
flat_k = torch.zeros(dim1 * dim2)
for i in range(len(kernel)):
flat_k[i * dim1:i * dim1 + kernel.shape[0]] = kernel[i]
сейчас flat_k
- это первый столбец матрицы Теплица, поэтому вы можете использовать scipy.linalg.toeplitz
:
from scipy.linalg import toeplitz
k = toeplitz(flat_k.numpy())
или, если вы хотите иметь возможность обратного пропуска через него, вы можете посмотреть исходный код функции toeplitz
в scipy и реализовать эквивалент в Pytorch.