Shortcuts

torch.linalg.lu_factor

torch.linalg.lu_factor(A, *, bool pivot=True, out=None) -> (Tensor, Tensor)

计算矩阵的LU分解的部分旋转的紧凑表示。

此函数计算由 torch.linalg.lu() 给出的分解的紧凑表示。 如果矩阵是方阵,此表示可用于 torch.linalg.lu_solve() 以解决共享矩阵 A 的线性方程组。

返回的分解表示为一个命名元组 (LU, pivots)LU 矩阵与输入矩阵 A 具有相同的形状。其上三角和下三角部分编码了 A 的 LU 分解中 LU 的非常数元素。

返回的置换矩阵由一个1索引的向量表示。pivots[i] == j 表示在算法的第i步中,第i行与第j-1行进行了置换。

在CUDA上,可以使用pivot= False。在这种情况下,此函数返回不存在枢轴的LU分解。

支持float、double、cfloat和cdouble数据类型的输入。 还支持矩阵的批处理,如果输入是矩阵的批处理,则输出具有相同的批处理维度。

注意

当输入位于CUDA设备上时,此函数会与CPU同步该设备。如需不进行同步的版本,请参见torch.linalg.lu_factor_ex()

警告

LU 分解几乎从来都不是唯一的,因为通常存在不同的置换矩阵可以产生不同的 LU 分解。因此,不同的平台,如 SciPy,或在不同设备上的输入,可能会产生不同的有效分解。

仅当输入矩阵为满秩时,才支持梯度计算。 如果未满足此条件,则不会抛出错误,但梯度可能不是有限的。 这是因为带枢轴的LU分解在这些点上不可微。

另请参阅

torch.linalg.lu_solve() 解决了给定输入矩阵为方阵且可逆的情况下,由该函数输出的线性方程组。

torch.lu_unpack()lu_factor() 返回的张量解包为构成分解的三个矩阵 P, L, U

torch.linalg.lu() 计算一个可能是非方阵的矩阵的部分旋转LU分解。它是 lu_factor()torch.lu_unpack() 的组合。

torch.linalg.solve() 解决了一个线性方程组。它是 lu_factor()lu_solve() 的组合。

Parameters

A (张量) – 形状为 (*, m, n) 的张量,其中 * 表示零个或多个批次维度。

Keyword Arguments
  • pivot (bool, 可选) – 是否使用部分旋转计算LU分解,或使用常规LU分解。pivot= False 在CPU上不支持。默认值:True

  • out (tuple, 可选) – 用于写入输出的两个张量的元组。如果为None,则忽略。默认值:None

Returns

一个命名的元组 (LU, pivots)

Raises

RuntimeError – 如果 A 矩阵不可逆或批量 A 中的任何矩阵不可逆。

示例:

>>> A = torch.randn(2, 3, 3)
>>> B1 = torch.randn(2, 3, 4)
>>> B2 = torch.randn(2, 3, 7)
>>> LU, pivots = torch.linalg.lu_factor(A)
>>> X1 = torch.linalg.lu_solve(LU, pivots, B1)
>>> X2 = torch.linalg.lu_solve(LU, pivots, B2)
>>> torch.allclose(A @ X1, B1)
True
>>> torch.allclose(A @ X2, B2)
True