私は現在、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() に渡す行列はどのように見える必要がありますか?
ありがとう