torch.linalg.eig¶
- torch.linalg.eig(A, *, out=None)¶
計算方陣的特徵值分解(如果存在)。
令 為 或 ,方陣 的特徵值分解(如果存在)定義為
此分解存在若且唯若 是 可對角化的。當其所有特徵值都不同時,就是這種情況。
支援 float、double、cfloat 和 cdouble 資料類型作為輸入。 也支援批次矩陣,如果
A
是一批矩陣,則輸出具有相同的批次維度。不保證返回的特徵值具有任何特定順序。
注意
實數矩陣的特徵值和特徵向量可能為複數。
注意
當輸入位於 CUDA 裝置上時,此函數會將該裝置與 CPU 同步。
警告
此函數假設
A
是 可對角化的(例如,當所有特徵值都不同時)。 如果它不可對角化,則返回的特徵值將是正確的,但 。警告
返回的特徵向量經過正規化,使其範數為 1。 即使這樣,矩陣的特徵向量也不是唯一的,也不會隨著
A
而連續。 由於這種缺乏唯一性,不同的硬體和軟體可能會計算出不同的特徵向量。這種非唯一性是因為將特徵向量乘以 會產生矩陣的另一組有效特徵向量。因此,損失函數不應取決於特徵向量的相位,因為這個量沒有明確的定義。在計算此函數的梯度時會檢查這一點。因此,當輸入位於 CUDA 裝置上時,此函數的梯度計算會將該裝置與 CPU 同步。
警告
僅當
A
具有不同的特徵值時,使用 eigenvectors 張量計算的梯度才會是有限的。此外,如果任意兩個特徵值之間的距離接近於零,則梯度在數值上將是不穩定的,因為它取決於通過計算 的特徵值。參見
torch.linalg.eigvals()
僅計算特徵值。與torch.linalg.eig()
不同,eigvals()
的梯度在數值上始終是穩定的。torch.linalg.eigh()
提供了一個(更快)的函數,用於計算埃爾米特矩陣和對稱矩陣的特徵值分解。torch.linalg.svd()
提供了一個函數,用於計算另一種類型的譜分解,該譜分解適用於任何形狀的矩陣。torch.linalg.qr()
提供了另一種(快得多)的分解,該分解適用於任何形狀的矩陣。- 參數
A (Tensor) – 形狀為 (*, n, n) 的張量,其中 * 是由可對角化矩陣組成的零個或多個批次維度。
- 關鍵字參數
out (tuple, optional) – 兩個張量的輸出元組。如果為 None,則忽略。預設值:None。
- 返回
一個名為 (eigenvalues, eigenvectors) 的命名元組,它對應於上面的 和 。
即使
A
是實數,eigenvalues 和 eigenvectors 也將始終是複數值。特徵向量將由 eigenvectors 的各列給出。
範例
>>> A = torch.randn(2, 2, dtype=torch.complex128) >>> A tensor([[ 0.9828+0.3889j, -0.4617+0.3010j], [ 0.1662-0.7435j, -0.6139+0.0562j]], dtype=torch.complex128) >>> L, V = torch.linalg.eig(A) >>> L tensor([ 1.1226+0.5738j, -0.7537-0.1286j], dtype=torch.complex128) >>> V tensor([[ 0.9218+0.0000j, 0.1882-0.2220j], [-0.0270-0.3867j, 0.9567+0.0000j]], dtype=torch.complex128) >>> torch.dist(V @ torch.diag(L) @ torch.linalg.inv(V), A) tensor(7.7119e-16, dtype=torch.float64) >>> A = torch.randn(3, 2, 2, dtype=torch.float64) >>> L, V = torch.linalg.eig(A) >>> torch.dist(V @ torch.diag_embed(L) @ torch.linalg.inv(V), A) tensor(3.2841e-16, dtype=torch.float64)