scipy.linalg.convolution_matrix

scipy.linalg.convolution_matrix(a, n, mode='full')[源代码]

构造一个卷积矩阵。

构造表示一维卷积的Toeplitz矩阵 [1]. 有关详细信息,请参阅下面的注释。

参数
a(M,)类似数组

要卷积的一维数组。

n集成

结果矩阵中的列数。它给出了要与之卷积的输入的长度 a 。这类似于 v 在……里面 numpy.convolve(a, v)

mode应力

这类似于 mode 在……里面 numpy.convolve(v, a, 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
=======  =========================

参见

toeplitz

Toeplitz矩阵

注意事项

代码::

A = convolution_matrix(a, n, mode)

创建Toeplitz矩阵 A 这样一来, A @ v 等同于使用 convolve(a, v, mode) 。返回的数组始终具有 n 列。行数取决于指定的 mode ,如上所述。

在默认的“完整”模式下, 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]

在“有效”模式下, A 由以下人员提供:

A[i, j] == (a[i-j+m-1] if (0 <= (i-j+m-1) < m) else 0)

这对应于一个矩阵,该矩阵的行是“全”情况下的行的子集,在该情况下, 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]

在“相同”模式下, A 由以下人员提供:

d = (m - 1) // 2
A[i, j] == (a[i-j+d] if (0 <= (i-j+d) < m) else 0)

“相同”模式的典型应用是当一个人有一个长度的信号时 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 新版功能.

参考文献

1

“卷积”,https://en.wikipedia.org/wiki/Convolution

示例

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