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)或不同裝置上的輸入可能會產生不同的有效分解。
警告
當
A中的每個矩陣的前 k = min(m, n) 列是線性無關的時,QR 分解才定義良好。如果不滿足此條件,不會丟擲錯誤,但得到的 QR 可能不正確,其自動微分可能會失敗或產生不正確的結果。- 引數
- 關鍵字引數
out (tuple, optional) – 包含兩個張量的輸出元組。如果為 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)