torch.linalg.qr
- torch.linalg.qr(A, mode='reduced', *, out=None)
-
计算矩阵的QR分解。
令 $\mathbb{K}$ 为 $\mathbb{R}$ 或 $\mathbb{C}$,矩阵 $A \in \mathbb{K}^{m \times n}$ 的完整 QR 分解定义为:
$A = QR\mathrlap{\qquad Q \in \mathbb{K}^{m \times m}, R \in \mathbb{K}^{m \times n}}$其中$Q$在实数情况下是正交矩阵,在复数情况下是酉矩阵,而$R$是具有实数对角线(即使在复数情况下也是如此)的上三角矩阵。
当 m > n (长矩阵)时,由于 R 是上三角矩阵,其最后的 m - n 行全为零。在这种情况下,我们可以舍去 Q 的最后 m - n 列来形成简约 QR 分解:
$A = QR\mathrlap{\qquad Q \in \mathbb{K}^{m \times n}, R \in \mathbb{K}^{n \times n}}$当 n >= m (宽矩阵)时,缩减的 QR 分解与完整的 QR 分解一致。
支持浮点型、双精度型、复数浮点型和复数双精度型的数据类型作为输入。还支持矩阵的批量处理,如果
A
是一组矩阵,那么输出将具有相同的批处理维度。参数
mode
用于选择完整或简化版的 QR 分解。如果矩阵A
的维度是 (*, m, n),其中 k = min(m, n)-
mode
= ‘reduced’ (默认):返回形状分别为 (*, m, k) 和 (*, k, n) 的 (Q, R)。它总是可微的。 -
mode = 'complete'
: 返回两个矩阵 (Q, R),它们的形状分别为 (*, m, m) 和 (*, m, n)。在 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 可能是不正确的,并且其自动微分可能会失败或产生不正确的结果。- 参数
- 关键字参数
-
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)
-