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 分解中L
和U
的非常数元素。返回的置换矩阵由一个 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)的张量,其中*表示零个或多个批次维度。
- 关键字参数
- 返回值
-
(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