5

私はeigsを使用して、大きい(数万)スパース正方行列の固有ベクトルを計算します。私が欲しいのは、固有ベクトルの最小のセットです。だが

eigs(A, 10, 'sm')      % Note: A is the matrix

実行速度が非常に遅くなります。

ただし、eigs(A、10、'lm')を使用すると、比較的速く答えが得られます。そして、私が試したように、eigs(A、10、'lm')で10をA_widthに置き換えて、これにすべての固有ベクトルが含まれるようにしても、この問題は解決されません。

それで、('sm'を使用して)最小のベクトルを計算するのが最大のベクトルを計算するよりもはるかに遅い理由を知りたいですか?

ところで、「sm」で「lm」と同じくらい速くeigを使用する方法について何かアイデアがあれば、教えてください。

4

3 に答える 3

7

ほとんどすべての標準eigs関数で使用されるアルゴリズムは、ランチョスアルゴリズム(のバリエーション)です。これは反復的であり、最初の反復で最大の固有値が得られます。これはあなたが行うほとんどすべての観察を説明します:

  1. 最大の固有値は、最小の反復回数で実行されます。
  2. 最小の固有値は、最大量の反復を取ります。
  3. すべての固有値も最大反復回数を取ります。

eigを「だまして」、実際に別の問題の最大の固有値にすることで、最小の固有値を計算するためのトリックがあります。これは通常、シフトパラメータによって実現されます。eigのMatlabドキュメントをざっと見てみると、sigmaパラメータがあり、役立つ可能性があります。数値の癖eigと同様に、行列がメモリに収まる場合は、同じドキュメントで適切に推奨されていることに注意してください。eigs

于 2013-11-21T09:02:02.217 に答える
2

eigsは実際にはm-file関数なので、プロファイルを作成できます。私はいくつかの基本的なテストを実行しましたが、それはマトリックス内のデータの性質に大きく依存します。次の2行のコードでプロファイラーを個別に実行する場合:

eigs(eye(1000), 10, 'lm'), and
eigs(eye(1000), 10, 'sm'),

次に、最初にarpackc(作業を実行するメイン関数-eigsおそらくここからのコメントによると)合計22回呼び出します。2番目の例では、103回呼び出されます。

一方、で試してみる

eigs(rand(1000), 10, 'lm'), and
eigs(rand(1000), 10, 'sm'),

オプションがオプションよりも何度も'lm'一貫して呼び出す結果が得られます。arpackcsm

アルゴリズムの詳細がわからないので、数学的な意味で説明することはできませんが、リンクしたページでは、ARPACKが何らかの構造を持つ行列に最適であると示唆しています。によって生成された行列はrand構造がほとんどないため、私が説明した後者の動作は、通常の動作条件下で期待するものではないと想定するのがおそらく安全です。

つまり、構造化された行列の最小の固有値を要求するときに、アルゴリズムが収束するまでにさらに多くの反復が必要になります。これは反復プロセスですが、提供する実際のデータに大きく依存します。

編集:ここにはこの方法に関する豊富な情報と参照があり、これが発生する理由を正確に理解するための鍵は確かにどこかに含まれています。

于 2013-03-26T11:49:41.493 に答える
2

その理由は実際にははるかに単純であり、大きなスパース固有値問題を解くための基本的なものです。これらはすべて解決に基づいています。

(1) A x = lam x

ほとんどの解法は、いくつかのべき法則を使用します(たとえば、ランチョス法とアーノルディ法の両方にまたがるクリロフ部分空間)

問題は、べき級数が(1)の最大固有値に収束することです。K^k = {A*r0,....,A^k*r0}したがって、最大の固有値は、行列ベクトルの乗算のみを必要とする次の部分空間によって検出されます(安価)。

最小のものを見つけるには、次のように(1)を再定式化する必要があります。

(2) 1/lam x = A^(-1) x or A^(-1) x = invlam x  

ここで、(2)の最大の固有値を解くことは、(1)の最小の固有値を見つけることと同じです。この場合、部分空間はによってスパンされK^k = {A^(-1)*r0,....,A^(-k)*r0}ます。これには、いくつかの線形システムを解く必要があります(高価です!)。

于 2015-09-10T06:48:39.940 に答える