本文简要介绍 python 语言中 scipy.linalg.convolution_matrix
的用法。
用法:
scipy.linalg.convolution_matrix(a, n, mode='full')#
构造一个卷积矩阵。
构造表示一维卷积 [1] 的 Toeplitz 矩阵。有关详细信息,请参阅下面的注释。
- a: (m,) 数组
要卷积的一维数组。
- n: int
结果矩阵中的列数。它给出了要与之卷积的输入的长度a.这类似于长度v在
numpy.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]
参考:
[1]“Convolution”、https://en.wikipedia.org/wiki/Convolution
例子:
>>> 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]])
相关用法
- Python SciPy linalg.cosm用法及代码示例
- Python scipy.linalg.cossin用法及代码示例
- Python SciPy linalg.companion用法及代码示例
- Python SciPy linalg.coshm用法及代码示例
- Python SciPy linalg.cdf2rdf用法及代码示例
- Python SciPy linalg.clarkson_woodruff_transform用法及代码示例
- Python SciPy linalg.cho_factor用法及代码示例
- Python SciPy linalg.cholesky用法及代码示例
- Python SciPy linalg.cho_solve_banded用法及代码示例
- Python SciPy linalg.cho_solve用法及代码示例
- Python SciPy linalg.circulant用法及代码示例
- Python SciPy linalg.cholesky_banded用法及代码示例
- Python SciPy linalg.cg用法及代码示例
- Python SciPy linalg.cgs用法及代码示例
- Python SciPy linalg.eigvalsh_tridiagonal用法及代码示例
- Python SciPy linalg.LaplacianNd用法及代码示例
- Python SciPy linalg.solve_circulant用法及代码示例
- Python SciPy linalg.polar用法及代码示例
- Python SciPy linalg.rsf2csf用法及代码示例
- Python SciPy linalg.hessenberg用法及代码示例
- Python SciPy linalg.tril用法及代码示例
- Python SciPy linalg.triu用法及代码示例
- Python SciPy linalg.svd用法及代码示例
- Python SciPy linalg.ishermitian用法及代码示例
- Python SciPy linalg.invhilbert用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.linalg.convolution_matrix。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。