当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy linalg.convolution_matrix用法及代码示例


本文简要介绍 python 语言中 scipy.linalg.convolution_matrix 的用法。

用法:

scipy.linalg.convolution_matrix(a, n, mode='full')#

构造一个卷积矩阵。

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

参数

a (m,) 数组

要卷积的一维数组。

n int

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

mode str

这类似于模式numpy.convolve(v, a, mode).它必须是 (‘full’, ‘valid’, ‘same’) 之一。见下文了解如何模式决定结果的形状。

返回

A (k, n) 数组

行数 k 取决于模式的卷积矩阵:

=======  =========================
 mode    k
=======  =========================
'full'   m + n -1
'same'   max(m, n)
'valid'  max(m, n) - min(m, n) + 1
=======  =========================

注意

代码:

A = convolution_matrix(a, n, mode)

创建一个 Toeplitz 矩阵A这样A @ v相当于使用convolve(a, v, mode).返回的数组总是有n列。行数取决于指定的模式,如上所述。

在默认的‘full’ 模式下,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]

在‘valid’ 模式下,A 的条目由下式给出:

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

这对应于一个矩阵,其行是 ‘full’ 情况的子集,其中所有系数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]

在‘same’ 模式中,A 的条目由下式给出:

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

‘same’ 模式的典型应用是当一个信号的长度为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]

参考

例子

>>> import numpy as np
>>> 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]])

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.linalg.convolution_matrix。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。