快捷方式

torch.linalg.qr

torch.linalg.qr(A, mode='reduced', *, out=None)

計算矩陣的 QR 分解。

K\mathbb{K}R\mathbb{R}C\mathbb{C},矩陣 AKm×nA \in \mathbb{K}^{m \times n}完整 QR 分解 定義為

A=QRQKm×m,RKm×nA = QR\mathrlap{\qquad Q \in \mathbb{K}^{m \times m}, R \in \mathbb{K}^{m \times n}}

其中 QQ 在實數情況下是正交矩陣,在複數情況下是酉矩陣,而 RR 是上三角矩陣,其對角線元素是實數(即使在複數情況下)。

m > n(高矩陣)時,由於 R 是上三角矩陣,其最後 m - n 行是零。在這種情況下,我們可以捨棄 Q 的最後 m - n 列,形成 簡化 QR 分解

A=QRQKm×n,RKn×nA = QR\mathrlap{\qquad Q \in \mathbb{K}^{m \times n}, R \in \mathbb{K}^{n \times n}}

n >= m(寬矩陣)時,簡化 QR 分解與完整 QR 分解一致。

支援 float、double、cfloat 和 cdouble 資料型別的輸入。也支援矩陣的批次輸入,如果 A 是矩陣的批次,則輸出具有相同的批次維度。

引數 mode 用於選擇完整 QR 分解或簡化 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 可能不正確,並且其自動微分(autodiff)可能會失敗或產生錯誤結果。

引數
  • A (Tensor) – 形狀為 (*, m, n) 的張量,其中 * 表示零個或多個批次維度。

  • mode (str, 可選) – ‘reduced’‘complete’‘r’ 之一。控制返回張量的形狀。預設值:‘reduced’

關鍵字引數

out (tuple, 可選) – 包含兩個張量的輸出元組。如果為 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)

文件

訪問 PyTorch 的全面開發者文件

檢視文件

教程

獲取面向初學者和高階開發者的深度教程

檢視教程

資源

查詢開發資源並獲得問題解答

檢視資源