torch.linalg.lu
- torch.linalg.lu(A, *, pivot=True, out=None)
-
计算带有部分选主元的矩阵的LU分解。
令 $\mathbb{K}$ 为 $\mathbb{R}$ 或 $\mathbb{C}$,矩阵 $A \in \mathbb{K}^{m \times n}$ 的部分选主元的 LU 分解定义为:
$A = PLU\mathrlap{\qquad P \in \mathbb{K}^{m \times m}, L \in \mathbb{K}^{m \times k}, U \in \mathbb{K}^{k \times n}}$其中 k = min(m,n),$P$ 是一个置换矩阵,$L$ 是主对角线为1的下三角矩阵,而$U$ 是上三角矩阵。
如果
pivot
= False 且矩阵A
在 GPU 上,则计算无选主元的 LU 分解$A = LU\mathrlap{\qquad L \in \mathbb{K}^{m \times k}, U \in \mathbb{K}^{k \times n}}$当
pivot = False
时,返回的矩阵P
将会是空的。如果不进行选主元操作,LU分解可能不存在,如果A
的任一主子式是奇异矩阵的话。在这种情况下,输出矩阵中可能会包含inf或NaN。支持浮点型、双精度型、复数浮点型和复数双精度型的数据类型作为输入。还支持矩阵的批量处理,如果
A
是一组矩阵,那么输出将具有相同的批处理维度。参见
torch.linalg.solve()
使用带部分选主元的LU分解来求解线性方程组。警告
LU 分解几乎从不会是唯一的,因为通常有多种置换矩阵可以得到不同的 LU 分解结果。因此,不同的平台(如 SciPy)或在不同设备上运行的输入可能会产生不同的有效分解。
警告
只有当输入矩阵是满秩时,才支持梯度计算。如果不满足这个条件,虽然不会抛出错误,但梯度可能不会是有限值。这是因为带有选主元的LU分解在这些点上是不可微的。
- 参数
- 关键字参数
-
out (元组, 可选) – 由三张张量组成的输出元组。如果为None则忽略。默认值:None。
- 返回值
-
(P, L, U) 这样的命名元组。
示例:
>>> A = torch.randn(3, 2) >>> P, L, U = torch.linalg.lu(A) >>> P tensor([[0., 1., 0.], [0., 0., 1.], [1., 0., 0.]]) >>> L tensor([[1.0000, 0.0000], [0.5007, 1.0000], [0.0633, 0.9755]]) >>> U tensor([[0.3771, 0.0489], [0.0000, 0.9644]]) >>> torch.dist(A, P @ L @ U) tensor(5.9605e-08) >>> A = torch.randn(2, 5, 7, device="cuda") >>> P, L, U = torch.linalg.lu(A, pivot=False) >>> P tensor([], device='cuda:0') >>> torch.dist(A, L @ U) tensor(1.0376e-06, device='cuda:0')