convolution_matrix#
- scipy.linalg.convolution_matrix(a, n, mode='full')[Quelle]#
Konstruiert eine Konvolutionsmatrix.
Konstruiert die Toeplitz-Matrix, die eine eindimensionale Konvolution darstellt [1]. Details finden Sie unten in den Hinweisen.
- Parameter:
- a(…, m) array_like
Das 1D-Array, das gefaltet werden soll. N-dimensionale Arrays werden als Stapel behandelt: Jeder Schnitt entlang der letzten Achse ist ein 1D-Array, das gefaltet werden soll.
- nint
Die Anzahl der Spalten in der resultierenden Matrix. Sie gibt die Länge des Inputs an, der mit a gefaltet wird. Dies ist analog zur Länge von v in
numpy.convolve(a, v).- modestr
Dies ist analog zu mode in
numpy.convolve(v, a, mode). Es muss einer der Werte (‘full’, ‘valid’, ‘same’) sein. Wie mode die Form des Ergebnisses bestimmt, siehe unten.
- Rückgabe:
- A(…, k, n) ndarray
Die Konvolutionsmatrix, deren Zeilenanzahl k von mode abhängt
======= ========================= mode k ======= ========================= 'full' m + n -1 'same' max(m, n) 'valid' max(m, n) - min(m, n) + 1 ======= =========================
Bei Stapel-Input entspricht jeder Schnitt der Form
(k, n)entlang der letzten beiden Dimensionen des Outputs einem Schnitt der Form(m,)entlang der letzten Dimension des Inputs.
Siehe auch
toeplitzToeplitz-Matrix
Hinweise
Der Code
A = convolution_matrix(a, n, mode)
erzeugt eine Toeplitz-Matrix A, so dass
A @ väquivalent zur Verwendung vonconvolve(a, v, mode)ist. Das zurückgegebene Array hat immer n Spalten. Die Anzahl der Zeilen hängt vom angegebenen mode ab, wie oben erläutert.Im Standardmodus ‘full’ sind die Einträge von A gegeben durch
A[i, j] == (a[i-j] if (0 <= (i-j) < m) else 0)
wobei
m = len(a). Nehmen wir zum Beispiel an, das Eingabearray ist[x, y, z]. Die Konvolutionsmatrix hat die Form[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]
Im Modus ‘valid’ sind die Einträge von A gegeben durch
A[i, j] == (a[i-j+m-1] if (0 <= (i-j+m-1) < m) else 0)
Dies entspricht einer Matrix, deren Zeilen die Teilmenge der Zeilen aus dem ‘full’-Fall sind, bei denen alle Koeffizienten in a in der Zeile enthalten sind. Für die Eingabe
[x, y, z]sieht diese Matrix wie folgt aus[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]
Im Modus ‘same’ sind die Einträge von A gegeben durch
d = (m - 1) // 2 A[i, j] == (a[i-j+d] if (0 <= (i-j+d) < m) else 0)
Die typische Anwendung des Modus ‘same’ ist, wenn man ein Signal der Länge n hat (wobei n größer als
len(a)ist) und das gewünschte Ergebnis ein gefiltertes Signal ist, das immer noch die Länge n hat.Für die Eingabe
[x, y, z]sieht diese Matrix wie folgt aus[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]
Hinzugefügt in Version 1.5.0.
Referenzen
[1]„Convolution“, https://en.wikipedia.org/wiki/Convolution
Beispiele
>>> 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]])
Vergleichen Sie die Multiplikation mit A mit der Verwendung von
numpy.convolve.>>> x = np.array([1, 2, 0, -3, 0.5]) >>> A @ x array([ 2. , 6. , -1. , -12.5, 8. ])
Überprüfen Sie, ob
A @ xdasselbe Ergebnis liefert wie die Anwendung der Faltungsfunktion.>>> np.convolve([-1, 4, -2], x, mode='same') array([ 2. , 6. , -1. , -12.5, 8. ])
Zum Vergleich mit dem oben gezeigten Fall
mode='same'sind hier die Matrizen aufgeführt, die vonmode='full'undmode='valid'für dieselben Koeffizienten und dieselbe Größe erzeugt werden.>>> 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]])