torch.qr

torch.qr(input, some=True, *, out=None)

计算矩阵或矩阵批次input的QR分解,并返回一个包含两个张量Q和R的namedtuple。其中$\text{input} = Q R$$Q$是一个正交矩阵或正交矩阵批次,而$R$是一个上三角矩阵或上三角矩阵的批次。

如果 someTrue,则该函数返回稀疏(简化)的 QR 分解。否则,如果 someFalse,则该函数返回完整的 QR 分解。

警告

torch.qr() 已被torch.linalg.qr() 替代,并将在未来的 PyTorch 版本中移除。布尔参数 some 被字符串参数 mode 取代。

应将 Q, R = torch.qr(A) 替换为

Q, R = torch.linalg.qr(A)

应将 Q, R = torch.qr(A, some=False) 替换为

Q, R = torch.linalg.qr(A, mode="complete")

警告

如果你计划通过QR进行反向传播,请注意,当前的反向实现仅在input的前$\min(input.size(-1), input.size(-2))$列线性独立时才有定义。一旦QR支持选主元操作,这种行为可能会发生变化。

注意

此函数针对CPU输入采用LAPACK,针对CUDA输入采用MAGMA,并且可能在不同设备类型或不同平台上生成不同的但有效的分解结果。

参数
  • input (Tensor) – 输入张量的大小为 $(*, m, n)$,其中 * 表示零个或多个批次维度,每个批次维度由尺寸为 $m \times n$ 的矩阵组成。

  • some (bool, 可选) –

    将值设为True来进行简化后的QR分解,或设为False来进行完整的QR分解。若k = min(m, n),则:

    • some=True:返回(Q, R),维度分别为 (m, k) 和 (k, n) (默认设置)

    • 'some=False': 返回 (Q, R),其中 Q 的维度是 (m, m),R 的维度是 (m, n)

关键字参数

out (元组, 可选) – 包含 QR 张量的元组。关于 QR 的维度信息,请参阅上述 some 描述。

示例:

>>> a = torch.tensor([[12., -51, 4], [6, 167, -68], [-4, 24, -41]])
>>> q, r = torch.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]])
>>> torch.mm(q, r).round()
tensor([[  12.,  -51.,    4.],
        [   6.,  167.,  -68.],
        [  -4.,   24.,  -41.]])
>>> torch.mm(q.t(), q).round()
tensor([[ 1.,  0.,  0.],
        [ 0.,  1., -0.],
        [ 0., -0.,  1.]])
>>> a = torch.randn(3, 4, 5)
>>> q, r = torch.qr(a, some=False)
>>> torch.allclose(torch.matmul(q, r), a)
True
>>> torch.allclose(torch.matmul(q.mT, q), torch.eye(5))
True
本页目录