1

列確率行列 A(n 行 n 列の実数、非負行列) があり、C++ で次の方程式を解きたい: Ax=x

固有値が 1 でなければならない固有ベクトル x を見つける必要があると仮定していますが (そうですか?)、C++ ではそれを理解できませんでした。これまでのところ、Seldon、CPPScaLapack、Eigen などの数学ライブラリをチェックしてきました...その中で、Eigen は良いオプションのようですが、上記の方程式を解くためにそれらを利用する方法がわかりませんでした。

方程式を解くための提案/コードスニペットまたはアイデアを教えてください。どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

1

もう 1 つの方法は、行列のカーネルから単位行列を引いたものを計算することです。これは、行列のサイズと他の固有値に応じて、カールによって説明されているべき乗反復を使用するよりも高速である場合とそうでない場合があります。行列が大きくなり、2 番目の固有値が 1 から遠ざかると、ベキ反復はより適切になります。

アイデアは、Ax = x を Ax - x = 0 に書き換えることです。次に、その Ix = x を使用します。ここで、I は単位行列を示します。したがって、Ax - x = 0 は Ax - Ix = 0 または (AI) x = 0 と同等です。したがって、固有ベクトル x は AI のカーネル (またはヌル空間) にあります。

このチュートリアル ページでは、Eigen を使用して行列のカーネルを計算する方法について説明します。テストされていないコード:

MatrixXf M;
/* initialize M */
FullPivLU<MatrixXf> lu_decomp(M);
VectorXf x = lu_decomp.kernel().col(0);
/* x now contains the vector you want */

カーネルが空であることがわかる場合があります。これは、マトリックスが実際には確率論的ではないか、しきい値を調整する必要があることを意味します (上記のリンク先のページを参照)。

于 2011-03-28T09:23:23.647 に答える
1

確率行列 $M$ の最大の固有ベクトルは 1 であるため、反復によってこの固有ベクトルを見つけることができます (初期値を推測するのが本当に苦手でない限り)。

値 (確率) の合計が 1 になるランダムに選択された初期ベクトル $v_1$ から始めます。$M$ を $v_1$ に適用して $Mv_1$ を取得します。次に、この新しいベクトル $Mv_1$ を再正規化します。つまり、その要素の合計で割って $v_2$ を取得します。これは確率の新しいベクトルであり、目的の固有ベクトルにより近くなります (最初の推測がたまたま固有ベクトルに直交していない限り)。

$v_k$ が安定に近づくまで、このプロセスを繰り返します。必要に応じて、これは $Mv_k = v_k$ のベクトルである必要があります。

于 2011-03-26T01:19:23.130 に答える