密な複素行列の固有ベクトル分解を見つけたいA
A = V.diag(lambda).V^-1
必要に応じて行列を正確に再現するには少数の固有ベクトルしか必要ありませんが、どの固有ベクトルを含めるかを決定するために、固有値に対して重要なフィルタリングを実行する必要があります。私の問題では、固有値/固有ベクトルが物理的に意味のある結果であるため、特異値分解を使用することは適切ではありません。
私は を使用してscipy.linalg.eig
います。これは、lapack のZGEEV
ルーチンの便利なラッパーです。数学的にV^-1
は、左固有ベクトルの適切にスケーリングされたバージョンから取得できるはずです。V
これは、右固有ベクトルの行列を反転するよりも効率的で安定していると予想していました。
ただし、2 つのアプローチを比較すると、分解された行列で両方の左固有ベクトルを使用する方が、反転した右固有ベクトルを使用する場合よりもはるかに精度が低いようです。おそらく、これはある種の丸め誤差または切り捨て誤差です。右の固有ベクトルの行列は非常に大きくなる可能性があり (1000 のオーダー)、この操作を何度も繰り返す必要があるため、反転しないことをお勧めします。
効率的かつ正確に分解を行う scipy (または lapack または自分でラップできる他のルーチン) で使用できるルーチンはありますか?