快捷键

torch.linalg.qr

torch.linalg.qr(A, mode='reduced', *, out=None)

计算矩阵的 QR 分解。

K\mathbb{K}R\mathbb{R}C\mathbb{C} ,矩阵 AKm×nA \in \mathbb{K}^{m \times n} 的完全 QR 分解定义为

A=QRQKm×m,RKm×nA = QR\mathrlap{\qquad Q \in \mathbb{K}^{m \times m}, R \in \mathbb{K}^{m \times n}}

其中 QQ 在实数情况下是正交的,在复数情况下是酉的,而 RR 是上三角矩阵,并且对角线上的元素是实数(即使在复数情况下也是如此)。

当 m > n(高矩阵)时,由于 R 是上三角矩阵,其最后 m - n 行是零。在这种情况下,我们可以删除 Q 的最后 m - n 列,以形成简化 QR 分解:

A=QRQKm×n,RKn×nA = QR\mathrlap{\qquad Q \in \mathbb{K}^{m \times n}, R \in \mathbb{K}^{n \times n}}

当 n >= m(宽矩阵)时,简化 QR 分解与完全 QR 分解一致。

支持输入 float、double、cfloat 和 cdouble 数据类型。也支持矩阵批处理,如果 A 是矩阵批,则输出具有相同的批维度。

参数 mode 在完全 QR 分解和简化 QR 分解之间进行选择。如果 A 的形状为(*, m, n),则 k=min(m, n)

  • mode = ‘reduced’(默认):返回形状分别为(*, m, k)和(*, k, n)的(Q, R)。它总是可微分的。

  • mode = ‘complete’:返回形状分别为(*, m, m)和(*, m, n)的(Q, R)。当 m <= n 时,它是可微分的。

  • mode = ‘r’:仅计算简化 R。返回(Q, R)中 Q 为空,R 的形状为(*, k, n)。它从不具有可微性。

与 numpy.linalg.qr 的区别:

  • mode = ‘raw’尚未实现。

  • 与 numpy.linalg.qr 不同,此函数总是返回两个张量的元组。当 mode = ‘r’时,Q 张量是一个空张量。

警告

R 矩阵对角线上的元素不一定为正。因此,返回的 QR 分解仅在对角线符号上唯一。因此,不同的平台,如 NumPy,或不同设备上的输入,可能会产生不同的有效分解。

警告

QR 分解仅在 A 中每个矩阵的前 k = min(m, n)列线性无关时才有意义。如果这个条件不满足,不会抛出错误,但生成的 QR 可能不正确,其自动微分可能会失败或产生错误结果。

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

  • 模式(str,可选)- 'reduced'、'complete'、'r'之一。控制返回张量的形状。默认:'reduced'。

关键字参数:

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

返回值:

命名元组(Q,R)。

示例:

>>> A = torch.tensor([[12., -51, 4], [6, 167, -68], [-4, 24, -41]])
>>> Q, R = torch.linalg.qr(A)
>>> Q
tensor([[-0.8571,  0.3943,  0.3314],
        [-0.4286, -0.9029, -0.0343],
        [ 0.2857, -0.1714,  0.9429]])
>>> R
tensor([[ -14.0000,  -21.0000,   14.0000],
        [   0.0000, -175.0000,   70.0000],
        [   0.0000,    0.0000,  -35.0000]])
>>> (Q @ R).round()
tensor([[  12.,  -51.,    4.],
        [   6.,  167.,  -68.],
        [  -4.,   24.,  -41.]])
>>> (Q.T @ Q).round()
tensor([[ 1.,  0.,  0.],
        [ 0.,  1., -0.],
        [ 0., -0.,  1.]])
>>> Q2, R2 = torch.linalg.qr(A, mode='r')
>>> Q2
tensor([])
>>> torch.equal(R, R2)
True
>>> A = torch.randn(3, 4, 5)
>>> Q, R = torch.linalg.qr(A, mode='complete')
>>> torch.dist(Q @ R, A)
tensor(1.6099e-06)
>>> torch.dist(Q.mT @ Q, torch.eye(4))
tensor(6.2158e-07)

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源并获得您的疑问解答

查看资源