torch.linalg.lu_factor

torch.linalg.lu_factor(A, *, pivot=True (bool), 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 分解。

支持浮点型、双精度型、复数浮点型和复数双精度型的数据类型。还支持矩阵批处理,如果输入是矩阵批处理,则输出将具有相同的批处理维度。

注意

当输入位于 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() 的组合。

参数

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

关键字参数
  • pivot (bool, 可选) – 是否计算带有部分选主元的LU分解,或者常规的LU分解。在CPU上pivot = False 不被支持。默认值: True

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

返回值

(LU, pivots) 这样的命名元组。

异常

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
本页目录