本文簡要介紹 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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。