【问题标题】:How can I generate a Toeplitz matrix in the correct form for performing discrete convolution?如何生成正确形式的 Toeplitz 矩阵以执行离散卷积?
【发布时间】:2015-12-30 19:50:50
【问题描述】:

离散卷积可以通过Toeplitz矩阵进行,如下图(Wiki article)

请注意,这与一般 Toeplitz 矩阵的形式并不完全相同,但它经历了各种移位和零填充。

有没有办法在 numpy 中完全基于 rollhstack 等来实现这一点,即不使用任何 for 循环?我已经尝试了各种转变,但我无法真正将它变成上面显示的形式。

【问题讨论】:

    标签: python numpy linear-algebra convolution toeplitz


    【解决方案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]])
    

    【讨论】:

    • 这是否适用于 2x2 numpy 数组作为输入信号?
    • 不,scipy.linalg.toeplitz 将其所有输入视为一维数组。无论如何,我不确定 2x2 输入数组在这种情况下意味着什么。
    • 例如图像和图像内核之间的卷积。
    • 显然可以通过这个方法在matlab中实现stackoverflow.com/questions/16798888/…
    • 在那个 MATLAB 问题中,如果您的内核是 x-y 可分离的,那么您可以将其表示为两个 1D 权重向量,然后如上所述构造两个单独的 Toeplitz 矩阵,并沿不同的轴计算两个单独的点积你的图像数组。
    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多