1

eighスパースライブラリとeigsh通常のlinalgライブラリの次の使用法で同じ答えが得られるべきではありませんか?

from numpy import random
from scipy.linalg import eigh as E1
from scipy.sparse.linalg import eigsh as E2

# Number of eigenvectors to check
kv = 4

# Make a symmetric matrix
N = 20
A = random.random((N,N))
A += A.T
assert( (A==A.T).all() )

L1,V1 = E1(A)
L2,V2 = E2(A,k=kv)

print sorted(L1)[::-1][:kv]
print sorted(L2)[::-1]

いくつかのサンプル値:

[20.189135474050769, 3.1309586179883211, 2.6576577451888599, 2.3435647560235355]
[20.18913547405079, 3.1309586179883317, -2.9218877679802597, -3.2962262932479751]

[19.688806193598253, 3.195683848729701, 3.0987244589789058, 2.5648352930907214]
[19.688806193598261, 3.1956838487296961, 3.0987244589789014, -2.7495588013870975]

[20.482117184188727, 3.3175885619590439, 2.8910051228982252, 2.746127351510173]
[20.482117184188716, 3.3175885619590524, 2.891005122898231, 2.7461273515101809]

内部のLancozルーチンが時々収束しているように私には見えます。厄介なのは、いくつかの値に対して機能することです。3番目の例では、最初の4つの固有値が正しいことがわかりますが、他の2つの例ではそうではありません。

バージョン:Python 2.7.3、numpy 1.6.1、scipy 0.9.0

4

2 に答える 2

3

固有値を絶対値で並べ替える必要があります。次のコードでも同じ結果が得られます。

print sorted(L1, key=abs)[::-1][:kv]
print sorted(L2, key=abs)[::-1]
于 2012-04-20T01:02:56.187 に答える
-1

絶対値で並べ替えると(@HYRYで提案されているように)、両方のテストで同じ結果が得られますが、私の根本的な目的は行列から最大の固有値を取得することであったため、それでも満足のいくものではありません。eigsh実対称行列の場合、最大の固有値が返されると思いました。そうではなく、大きさでソートされた最大の固有値を返します。

于 2012-04-20T13:41:06.900 に答える