1. ホーム
  2. python-3.x

[解決済み] NumPy:linalg.eig()とlinalg.eigh()の違いについて

2022-02-10 04:32:50

質問

Python 3 アプリケーションで、対称実数行列の固有値と固有ベクトルを計算するためにNumPyを使用しています。

以下は私のデモコードです。

import numpy as np
a = np.random.rand(3,3)  # generate a random array shaped (3,3)

a = (a + a.T)/2  # a becomes a random simmetric matrix    

evalues1, evectors1 = np.linalg.eig(a)

evalues2, evectors2 = np.linalg.eigh(a)

符号を除けば、同じ固有ベクトルと固有値を得ることができました。 np.linalg.eignp.linalg.eigh . では、この2つの方法の違いは何でしょうか?

ありがとうございます


EDITです。 ここのドキュメントを読みました https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html とこちら https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigh.html を使用する必要があるのか、理解できません。 eigh() 対称的な配列がある場合。

どのように解決するのですか?

eigh は、固有値がソートされていることを保証し、行列が対称であることを利用した、より高速なアルゴリズムを使用します。 行列が対称であることが分かっている場合は、この関数を使用してください。
注意事項 , eigh は、行列が本当に対称であるかどうかをチェックしません。デフォルトでは、行列の下三角形部分を受け取り、上三角形部分が行列の対称性によって定義されていると仮定します。

eig は一般的な行列に対して動作するので、より遅いアルゴリズムが使用されます。 %timeit . より大きな行列でテストすると,一般に固有値はソートされないことがわかります.