私は大規模な (複雑な) エルミート行列を扱っており、Python/Scipy を使用して効率的に対角化しようとしています。
のeigh
関数を使用scipy.linalg
すると、約 800x800 の行列を生成して対角化し、すべての固有値と固有ベクトルを計算するのに約 3 秒かかります。
私の問題の固有値は、0 の周りに対称的に分布し、おおよそ -4 から 4 の範囲です。ただし、負の固有値に対応する固有ベクトルのみが必要なので、計算しようとしている範囲が [-4,0) になります。
私の行列はまばらなので、scipy.sparse
パッケージとその関数を使用して を介して固有ベクトルを計算するのは自然なeigsh
ことです。
また、 を介して負の固有値のみを計算するようにプログラムに指示することもできますwhich='SA'
。この方法の問題点は、固有値/固有ベクトルの半分を計算するのに約 40 秒かかることです。小さな固有値を計算する場合、ARPACK アルゴリズムが非常に非効率的であることはわかっていますが、必要なすべての固有ベクトルを計算する他の方法は考えられません。
計算を高速化する方法はありますか?たぶん、シフト反転モードを使用して?非常に多くの対角化を行う必要があり、最終的には行列のサイズも大きくする必要があるため、現時点では少し迷っています。
私は本当に助けていただければ幸いです!