1

私は現在、3D空間内の一連の点の「正確な」境界球を見つける関数を作成中です。これまでのプロセスを十分に理解していると思いますが、行き詰まりました。

A) 3D 空間の点 B) 4x4 行列クラスに格納された 3x3 共分散行列 (行と列の代わりにセル m0、m1、m2、m3、m4、ect で参照)

ポイントの共分散行列の 3 つの固有値を見つけ、ガウス消去法によって行列を縮小行エシュロン形式 (rref) に変換する関数を設定しました。

オンラインで見つけた例の図に対してこれらの関数の両方をテストしましたが、正しく機能しているようです。

次のステップは、次の式を使用して固有ベクトルを見つけることです: (M - λ*I)*V

... ここで、M は共分散行列、λ は固有値の 1 つ、I は単位行列、V は固有ベクトルです。

ただし、固有ベクトル成分を計算する必要がある右端の列は、rref の実行前後で 0 であるため、rref する前に 4x3 マトリックスを正しく構築していないようです。それらが後でゼロになる理由は理解していますが(定数がなければ、線形方程式系の最も簡単な解はすべてゼロの係数です)、そこに何を入れるかについて途方に暮れています。

これまでの機能は次のとおりです。

Vect eigenVector(const Matrix &M, const float eval) {
   行列 A = 行列(M);
   -= マトリックス (IDENTITY)*eval;
   A.rref();
   return Vect(A[m3],A[m7],A[m11]);
}

3x3 共分散行列は M として渡され、固有値は eval として渡されます。Matrix(IDENTITY) は恒等行列を返します。m3、m7、および m11 は、4x3 行列の右端の列に対応します。

関数をテストするために使用している 3x3 マトリックス (4x4 マトリックス クラスに格納されている) の例を次に示します。

行列(1.5f, 0.5f, 0.75f, 0,
       0.5f、0.5f、0.25f、0、
      0.75f、0.25f、0.5f、0、
          0、0、0、0);

私は正しく (?) 他の関数から 2.097、0.3055、0.09756 の固有値を取得しています。

上記の eigenVector() は、渡された固有値を対角 (0,0 1,1 2,2) から正しく減算します

rref() 後の行列 A:

[(1, 0, 0, -0),
(-0、1、0、-0)、
(-0、-0、1、-0)、
(0, 0, 0, -2.09694)]

rref() 関数については、ここにある翻訳された Python 関数を使用しています: http://elonen.iki.fi/code/misc-notes/python-gaussj/index.html

固有ベクトルを取得するには、rref() に渡す行列はどのように見える必要がありますか?

ありがとう

4

2 に答える 2

1

ああ、さらに数時間の厳しい調査で、問題を解決することができました。

問題は、固有ベクトルの「1」セットではなく、さまざまな大きさの無限数があることです。

私が選択した方法は、RREF の代わりに REF (行階層形式) を使用することでした。行列に十分な情報を残して、z を任意の値に置き換え、逆方向に作業して y と x を解決できるようにします。次に、ベクトルを正規化して単位固有ベクトルを取得しました。これは目的に適しているはずです。

私の最終的なコード:

Vect eigenVector(const Matrix &M, const float eVal) {
   行列 A = 行列(M);
   -= マトリックス(IDENTITY)*eVal;
   A.ref();
   フロート K = 16; // 任意の値
   float J = -K*A[m6]; // J を見つけるために K に代入します
   float I = -K*A[m2]-J*A[m1]; // K と J を代入して I を見つけます

   Vect eVec = Vect(I,J,K);
   eVec.norm(); // 固有ベクトルを正規化します

   eVec を返します。
}

唯一の奇妙な点は、固有ベクトルが予想とは反対の方向を向いていることです (それらは否定されました!)。しかし、それは問題です。

于 2010-10-14T15:10:01.167 に答える
1

(M - λI)V は方程式ではなく、単なる式です。ただし、(M - λI)V = 0 です。そして、固有ベクトルを固有値に関連付ける方程式です。

したがって、rref関数が機能すると仮定すると、拡張行列を として作成すると想像できます。[(M - λI) | 0]ここで0、ゼロベクトルを示します。これはあなたがすでに行っているように聞こえるので、rref機能が壊れていると想定する必要があります。あるいは、4x4 行列を処理する方法がわかりません (4x3 行列とは対照的に、これは拡張行列に期待されるものです)。

于 2010-10-14T15:06:22.267 に答える