评价此页

torch.linalg.lu#

torch.linalg.lu(A, *, pivot=True, out=None)#

计算带部分主元的矩阵的 LU 分解。

K\mathbb{K}R\mathbb{R}C\mathbb{C},则矩阵 AKm×nA \in \mathbb{K}^{m \times n}带部分主元的 LU 分解定义为

A=PLUPKm×m,LKm×k,UKk×nA = 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)PP 是一个 置换矩阵LL 是一个下三角矩阵,对角线上为 1,而 UU 是一个上三角矩阵。

如果 pivot= FalseA 在 GPU 上,则计算的是不带主元的 LU 分解

A=LULKm×k,UKk×nA = LU\mathrlap{\qquad L \in \mathbb{K}^{m \times k}, U \in \mathbb{K}^{k \times n}}

pivot= False 时,返回的矩阵 P 将为空。如果 A 的任何主子式是奇异的,则不带主元的 LU 分解可能不存在。在这种情况下,输出矩阵可能包含 infNaN

支持浮点 (float)、双精度浮点 (double)、复数浮点 (cfloat) 和复数双精度浮点 (cdouble) 数据类型。还支持矩阵批处理,如果 `A` 是一个矩阵批处理,则输出具有相同的批处理维度。

另请参阅

torch.linalg.solve() 使用带部分主元的 LU 分解来求解线性方程组。

警告

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

警告

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

参数
  • A (Tensor) – 形状为 (*, m, n) 的张量,其中 * 是零个或多个批处理维度。

  • pivot (bool, optional) – 控制是计算带部分主元的 LU 分解还是不带主元的 LU 分解。默认为 True

关键字参数

out (tuple, optional) – 输出元组,包含三个张量。如果为 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')