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 新版功能.
参考文献
示例
>>> 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]])