scipy.linalg.

matmul_toeplitz#

scipy.linalg.matmul_toeplitz(c_or_cr, x, check_finite=False, workers=None)[Quelle]#

Effiziente Toeplitz-Matrix-Matrix-Multiplikation mittels FFT

Diese Funktion gibt das Matrixprodukt einer Toeplitz-Matrix mit einer dichten Matrix zurück.

Die Toeplitz-Matrix hat konstante Diagonalen, wobei c die erste Spalte und r die erste Zeile darstellt. Wenn r nicht angegeben ist, wird r == conjugate(c) angenommen.

Warnung

Ab SciPy 1.17 werden mehrdimensionale Eingaben als Stapel behandelt, nicht raveled. Um das bisherige Verhalten beizubehalten, raveln Sie Argumente, bevor Sie sie an matmul_toeplitz übergeben.

Parameter:
c_or_crarray_like oder Tupel aus (array_like, array_like)

Der Vektor c oder ein Tupel von Arrays (c, r). Wenn nicht angegeben, wird r = conjugate(c) angenommen; in diesem Fall ist die Toeplitz-Matrix hermitesch, wenn c[0] reell ist. r[0] wird ignoriert; die erste Zeile der Toeplitz-Matrix ist [c[0], r[1:]].

x(M,) oder (M, K) array_like

Matrix, mit der multipliziert werden soll.

check_finitebool, optional

Ob geprüft werden soll, ob die Eingabematrizen nur endliche Zahlen enthalten. Deaktivieren kann zu einer Leistungssteigerung führen, aber zu Problemen (Ergebnis ausschließlich NaNs) führen, wenn die Eingaben Unendlichkeiten oder NaNs enthalten.

workersint, optional

An scipy.fft.fft und ifft zu übergeben. Maximale Anzahl von Arbeitern für parallele Berechnungen. Wenn negativ, wrappt der Wert von os.cpu_count(). Weitere Details finden Sie unter scipy.fft.fft.

Rückgabe:
T @ x(M,) oder (M, K) ndarray

Das Ergebnis der Matrix-Matrix-Multiplikation T @ x. Die Form der Rückgabe entspricht der Form von x.

Siehe auch

toeplitz

Toeplitz-Matrix

solve_toeplitz

Lösen eines Toeplitz-Systems mittels Levinson-Rekursion

Hinweise

Die Toeplitz-Matrix wird in eine zirkuläre Matrix eingebettet und die FFT wird verwendet, um das Matrix-Matrix-Produkt effizient zu berechnen.

Da die Berechnung auf der FFT basiert, führen Ganzzahl-Eingaben zu Gleitkomma-Ausgaben. Dies unterscheidet sich von NumPy’s matmul, das den Datentyp der Eingabe beibehält.

Dies basiert teilweise auf der Implementierung, die in [1] unter der MIT-Lizenz zu finden ist. Weitere Informationen zur Methode finden Sie in Referenz [2]. Die Referenzen [3] und [4] enthalten weitere Implementierungsbeispiele in Python.

Hinzugefügt in Version 1.6.0.

Referenzen

[1]

Jacob R Gardner, Geoff Pleiss, David Bindel, Kilian Q Weinberger, Andrew Gordon Wilson, „GPyTorch: Blackbox Matrix-Matrix Gaussian Process Inference with GPU Acceleration“ mit Beiträgen von Max Balandat und Ruihan Wu. Online verfügbar unter: cornellius-gp/gpytorch

[2]

J. Demmel, P. Koev und X. Li, „A Brief Survey of Direct Linear Solvers“. In Z. Bai, J. Demmel, J. Dongarra, A. Ruhe und H. van der Vorst, Herausgeber. Templates for the Solution of Algebraic Eigenvalue Problems: A Practical Guide. SIAM, Philadelphia, 2000. Verfügbar unter: http://www.netlib.org/utk/people/JackDongarra/etemplates/node384.html

[3]

R. Scheibler, E. Bezzam, I. Dokmanic, Pyroomacoustics: A Python package for audio room simulations and array processing algorithms, Proc. IEEE ICASSP, Calgary, CA, 2018. LCAV/pyroomacoustics pyroomacoustics/adaptive/util.py

[4]

Marano S, Edwards B, Ferrari G und Fah D (2017), „Fitting Earthquake Spectra: Colored Noise and Incomplete Data“, Bulletin of the Seismological Society of America., Januar, 2017. Vol. 107(1), S. 276-291.

Beispiele

Multipliziere die Toeplitz-Matrix T mit der Matrix x

    [ 1 -1 -2 -3]       [1 10]
T = [ 3  1 -1 -2]   x = [2 11]
    [ 6  3  1 -1]       [2 11]
    [10  6  3  1]       [5 19]

Zur Spezifizierung der Toeplitz-Matrix werden nur die erste Spalte und die erste Zeile benötigt.

>>> import numpy as np
>>> c = np.array([1, 3, 6, 10])    # First column of T
>>> r = np.array([1, -1, -2, -3])  # First row of T
>>> x = np.array([[1, 10], [2, 11], [2, 11], [5, 19]])
>>> from scipy.linalg import toeplitz, matmul_toeplitz
>>> matmul_toeplitz((c, r), x)
array([[-20., -80.],
       [ -7.,  -8.],
       [  9.,  85.],
       [ 33., 218.]])

Überprüfe das Ergebnis, indem die vollständige Toeplitz-Matrix erstellt und mit x multipliziert wird.

>>> toeplitz(c, r) @ x
array([[-20, -80],
       [ -7,  -8],
       [  9,  85],
       [ 33, 218]])

Die vollständige Matrix wird niemals explizit gebildet, daher ist diese Routine für sehr große Toeplitz-Matrizen geeignet.

>>> n = 1000000
>>> matmul_toeplitz([1] + [0]*(n-1), np.ones(n))
array([1., 1., 1., ..., 1., 1., 1.], shape=(1000000,))