scipy.linalg.

matmul_toeplitz#

scipy.linalg.matmul_toeplitz(c_or_cr, x, check_finite=False, workers=None)[источник]#

Эффективное умножение матриц Тёплица с использованием БПФ

Эта функция возвращает матричное умножение между матрицей Тёплица и плотной матрицей.

Матрица Тёплица имеет постоянные диагонали, где c — её первый столбец, а r — первая строка. Если r не задан, r == conjugate(c) предполагается.

Предупреждение

Начиная с SciPy 1.17, многомерный ввод будет обрабатываться как пакет, а не ravelред. Чтобы сохранить существующее поведение, ravel аргументы перед передачей их в matmul_toeplitz.

Параметры:
c_or_crarray_like или кортеж из (array_like, array_like)

Вектор c, или кортеж массивов (c, r). Если не указан, r = conjugate(c) предполагается; в этом случае, если c[0] является вещественным, матрица Тёплица эрмитова. r[0] игнорируется; первая строка матрицы Тёплица [c[0], r[1:]].

x(M,) или (M, K) array_like

Матрица, на которую умножать.

check_finitebool, необязательно

Проверять ли, что входные матрицы содержат только конечные числа. Отключение может дать прирост производительности, но может привести к проблемам (результат полностью NaN), если входные данные содержат бесконечности или NaN.

workersint, необязательный

Для передачи в scipy.fft.fft и ifft. Максимальное количество рабочих процессов для параллельных вычислений. Если отрицательное, значение оборачивается от os.cpu_count(). См. scipy.fft.fft для подробностей.

Возвращает:
T @ x(M,) или (M, K) ndarray

Результат умножения матриц T @ x. Форма возвращаемого значения соответствует форме x.

Смотрите также

toeplitz

матрица Тёплица

solve_toeplitz

Решить систему Тёплица с использованием рекурсии Левинсона

Примечания

Матрица Тёплица встраивается в циркулянтную матрицу, и БПФ используется для эффективного вычисления произведения матриц.

Поскольку вычисление основано на БПФ, целочисленные входные данные приведут к вещественным выходным. Это отличается от NumPy matmul, что сохраняет тип данных входных данных.

Это частично основано на реализации, которую можно найти в [1], лицензировано по лицензии MIT. Дополнительную информацию о методе можно найти в ссылке [2]. Ссылки [3] и [4] иметь больше эталонных реализаций на Python.

Добавлено в версии 1.6.0.

Ссылки

[1]

Jacob R Gardner, Geoff Pleiss, David Bindel, Kilian Q Weinberger, Andrew Gordon Wilson, «GPyTorch: Blackbox Matrix-Matrix Gaussian Process Inference with GPU Acceleration» с вкладом от Max Balandat и Ruihan Wu. Доступно онлайн: cornellius-gp/gpytorch

[2]

Дж. Деммель, П. Коев и С. Ли, «Краткий обзор прямых линейных решателей». В З. Бай, Дж. Деммель, Дж. Донгарра, А. Руэ и Х. ван дер Ворст, редакторы. Шаблоны для решения алгебраических задач на собственные значения: Практическое руководство. SIAM, Филадельфия, 2000. Доступно по адресу: http://www.netlib.org/utk/people/JackDongarra/etemplates/node384.html

[3]

R. Scheibler, E. Bezzam, I. Dokmanic, Pyroomacoustics: Python пакет для моделирования акустики помещений и алгоритмов обработки массивов, Proc. IEEE ICASSP, Calgary, CA, 2018. LCAV/pyroomacoustics pyroomacoustics/adaptive/util.py

[4]

Мараньо С., Эдвардс Б., Феррари Г. и Фах Д. (2017), «Подгонка спектров землетрясений: цветной шум и неполные данные», Бюллетень Сейсмологического общества Америки., январь 2017. Том 107(1), стр. 276-291.

Примеры

Умножить матрицу Тёплица T на матрицу 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]

Чтобы задать матрицу Тёплица, нужны только первый столбец и первая строка.

>>> 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.]])

Проверьте результат, создав полную матрицу Тёплица и умножив её на x.

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

Полная матрица никогда не формируется явно, поэтому эта процедура подходит для очень больших матриц Тёплица.

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