torch.linalg.qr¶
- torch.linalg.qr(A, mode='reduced', *, out=None)¶
计算矩阵的QR分解。
设 为 或 , 矩阵的 完全QR分解 定义为
其中 在实数情况下是正交的,在复数情况下是酉的, 并且 是上三角的,且对角线为实数(即使在复数情况下也是如此)。
当 m > n(高矩阵)时,由于 R 是上三角矩阵,其最后 m - n 行均为零。 在这种情况下,我们可以去掉 Q 的最后 m - n 列,以形成 简化QR分解:
当n >= m(宽矩阵)时,简化QR分解与完全QR分解一致。
支持输入 float、double、cfloat 和 cdouble 数据类型。 还支持矩阵的批处理,如果
A
是矩阵的批处理,则输出具有相同的批处理维度。参数
mode
在完整和简化的 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 分解仅在 R 的对角线符号上具有唯一性。 因此,不同的平台,如 NumPy,或在不同设备上的输入, 可能会产生不同的有效分解。
警告
QR分解仅在矩阵
A
中的前k = min(m, n)列线性独立时才有定义。如果此条件不满足,不会抛出错误,但生成的QR可能不正确,并且其自动微分可能会失败或产生不正确的结果。- Parameters
- Keyword Arguments
out (元组, 可选) – 两个张量的输出元组。如果为None则忽略。默认值:None。
- Returns
一个命名元组 (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)