评价此页

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()在输入矩阵为方阵且可逆的情况下,利用此函数输出的LU分解结果来求解线性方程组。

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, optional) – 是否计算带部分主元的LU分解,或计算普通LU分解。 pivot= False 在CPU上不支持。默认值:True

  • out (tuple, optional) – 要写入输出的两个张量组成的元组。如果为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