torch.linalg.pinv
-
torch.linalg.pinv(A, *, atol=None, rtol=None, hermitian=False, out=None) → Tensor[исходный код] -
Вычисляет псевдообратную матрицу (обратную матрицу Мура — Пенроуза).
Псевдообратную матрицу можно определить алгебраически, однако вычислительно удобнее рассматривать её через SVD
Поддерживаются входные данные с типами float, double, cfloat и cdouble. Также поддерживаются пакеты матриц: если
A— это пакет матриц, выходные данные имеют те же пакетные размерности.Если
hermitian= True, предполагается, чтоAявляется эрмитовой матрицей, если она комплексная, или симметричной, если она вещественная, однако это не проверяется внутри функции. Вместо этого при вычислениях используется только нижняя треугольная часть матрицы.Сингулярные значения (или нормы собственных значений, если
hermitian= True), которые меньше порога , считаются нулевыми и отбрасываются при вычислениях, где — наибольшее сингулярное значение (или собственное значение).Если
rtolне задан иA— матрица размерности(m, n), относительный допуск устанавливается равным , а — значение эпсилон для типа данныхA(см.finfo). Еслиrtolне задан, аatolзадано больше нуля, тоrtolустанавливается равным нулю.Если
atolилиrtol— этоtorch.Tensor, его форма должна быть совместима с формой сингулярных значенийA, возвращаемых функциейtorch.linalg.svd().Примечание
Эта функция использует
torch.linalg.svd(), еслиhermitian= False, иtorch.linalg.eigh(), еслиhermitian= True. Для входных данных CUDA эта функция синхронизирует устройство с ЦП.Примечание
Если это возможно, для умножения матрицы слева на псевдообратную рекомендуется использовать
torch.linalg.lstsq(), например:torch.linalg.lstsq(A, B).solution == A.pinv() @ B
По возможности всегда предпочтительно использовать
lstsq(), поскольку этот способ быстрее и численно устойчивее, чем явное вычисление псевдообратной матрицы.Примечание
Эта функция имеет вариант, совместимый с NumPy,
linalg.pinv(A, rcond, hermitian=False). Однако использование позиционного аргументаrcondустарело; вместо него следует использоватьrtol.Предупреждение
Внутри функция использует
torch.linalg.svd()(илиtorch.linalg.eigh(), еслиhermitian= True), поэтому её производная подвержена тем же проблемам, что и производные этих функций. Подробнее см. предупреждения в документации функцийtorch.linalg.svd()иtorch.linalg.eigh().См. также
torch.linalg.inv()вычисляет обратную матрицу для квадратной матрицы.torch.linalg.lstsq()вычисляетA.pinv() @Bс помощью численно устойчивого алгоритма.- Параметры:
- Именованные аргументы:
-
-
atol (float, Tensor, необязательный) – абсолютный допуск. Если
None, считается равным нулю. По умолчанию:None. -
rtol (float, Tensor, необязательный) – относительный допуск. Значение, которое он принимает при
None, см. выше. По умолчанию:None. -
hermitian (bool, необязательный) – указывает, является ли
Aэрмитовой матрицей, если она комплексная, или симметричной, если она вещественная. По умолчанию:False. -
out (Tensor, необязательный) – выходной тензор. Игнорируется, если
None. По умолчанию:None.
-
atol (float, Tensor, необязательный) – абсолютный допуск. Если
Примеры:
>>> A = torch.randn(3, 5) >>> A tensor([[ 0.5495, 0.0979, -1.4092, -0.1128, 0.4132], [-1.1143, -0.3662, 0.3042, 1.6374, -0.9294], [-0.3269, -0.5745, -0.0382, -0.5922, -0.6759]]) >>> torch.linalg.pinv(A) tensor([[ 0.0600, -0.1933, -0.2090], [-0.0903, -0.0817, -0.4752], [-0.7124, -0.1631, -0.2272], [ 0.1356, 0.3933, -0.5023], [-0.0308, -0.1725, -0.5216]]) >>> A = torch.randn(2, 6, 3) >>> Apinv = torch.linalg.pinv(A) >>> torch.dist(Apinv @ A, torch.eye(3)) tensor(8.5633e-07) >>> A = torch.randn(3, 3, dtype=torch.complex64) >>> A = A + A.T.conj() # creates a Hermitian matrix >>> Apinv = torch.linalg.pinv(A, hermitian=True) >>> torch.dist(Apinv @ A, torch.eye(3)) tensor(1.0830e-06)
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.linalg.pinv.html