torch.qr
- torch.qr(input, some=True, *, out=None)
-
计算矩阵或矩阵批次
input
的QR分解,并返回一个包含两个张量Q和R的namedtuple。其中$\text{input} = Q R$,$Q$是一个正交矩阵或正交矩阵批次,而$R$是一个上三角矩阵或上三角矩阵的批次。如果
some
为True
,则该函数返回稀疏(简化)的 QR 分解。否则,如果some
为False
,则该函数返回完整的 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,并且可能在不同设备类型或不同平台上生成不同的但有效的分解结果。
- 参数
- 关键字参数
-
out (元组, 可选) – 包含 Q 和 R 张量的元组。关于 Q 和 R 的维度信息,请参阅上述
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