0

浮動小数点数の 8 x 8 行列があり、そこから固有ベクトルと固有値を計算する必要があります。これは、PCA (主成分分析) を使用した機能削減のためのものであり、従来の方法で行うと非常に時間のかかる作業です。Y = C*X X は私の 8 X 8 行列です。

                float[,] XMatrix = new float[8, 1];
                float[,] YMatrix = new float[8, 1];
                float max = 0;
                XMatrix[0, 0] = 1;



                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 1; j++)
                    {

                        for (int k = 0; k < 8; k++)
                        {
                            YMatrix[i, j] += C[i, k] * XMatrix[k, j];
                            if (YMatrix[i, j] > max)
                                max = YMatrix[i, j];
                        }

                    }
                }

私はそれが間違っていることを知っていますが、それを理解することはできません。累乗法またはおそらくより効果的な計算方法を使用するための助けが必要です.

前もって感謝します。

4

1 に答える 1

2

任意のサイズの (密な) 行列に対して効率的な方法 (つまり高速!) で固有値/固有ベクトルを取得することは、完全に自明ではありません。QR アルゴリズムのようなものを使用することをお勧めします (ただし、これは単一の 8x8 行列の 1 回限りの計算にはやり過ぎかもしれません)。

QR アルゴリズムは、行列の Schur 分解を計算します。これは、固有値計算において最も重要なアルゴリズムの 1 つです。ただし、これは密行列にのみ適用されます (前述のとおり)。

QR アルゴリズムは 2 つの段階で構成されています。最初に、相似変換によって、元の行列が有限数のステップでヘッセンベルグ形式、またはエルミート/対称の場合は実三重対角形式に変換されます。アルゴリズムのこの第 1 段階では、第 2 段階である、ヘッセンベルグまたは三重対角行列に適用される実際の QR 反復を準備します。

アルゴリズムの全体的な複雑さ (浮動小数点の数) は O(n3) です。このアルゴリズムの詳しい説明については、こちらを参照してください。または、Google で固有値アルゴリズムを検索すると、必要な固有値/ベクトルを計算するための多くの代替方法が提供されるはずです。

また、私はこれについて詳しく調べていませんが、Math.NETの無料ライブラリがここで役立つかもしれません...

于 2012-07-12T07:20:46.770 に答える