當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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