Собственный вектор и собственное значение матрицы 8 X 8

У меня есть матрица 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];
                        }

                    }
                }

Я знаю, что это неправильно, но не могу понять. Мне нужна помощь в использовании степенного метода или, возможно, более эффективного способа его расчета.

Заранее спасибо.


person Sujan    schedule 12.07.2012    source источник


Ответы (1)


Получение собственных значений/собственных векторов эффективным способом (то есть быстро!) для матрицы любого размера (плотной) не является полностью тривиальной задачей. Я бы посоветовал вам использовать что-то вроде алгоритма QR (хотя это может быть излишним для одноразового расчета одной матрицы 8x8).

Алгоритм QR вычисляет разложение Шура матрицы. Это, безусловно, один из самых важных алгоритмов в вычислениях собственных значений. Однако он применяется только к плотным матрицам (как указано выше).

Алгоритм QR состоит из двух отдельных этапов. Во-первых, с помощью преобразования подобия исходная матрица за конечное число шагов преобразуется в форму Хессенберга или – в эрмитовом/симметричном случае – в вещественную трехдиагональную форму. Этот первый этап алгоритма подготавливает его второй этап, фактические итерации QR, которые применяются к матрице Гессенберга или трехдиагональной матрице.

Общая сложность (количество плавающих точек) алгоритма составляет O(n3). Хорошее объяснение этого алгоритма см. здесь. Или поиск алгоритма собственных значений в Google должен предоставить вам множество альтернативных способов вычисления необходимых собственных значений/векторов.

Кроме того, я не рассматривал это подробно, но бесплатная библиотека Math.NET может вам здесь помочь. .

person MoonKnight    schedule 12.07.2012
comment
Спасибо. Для этого я использовал библиотеку Math.Net. Результат немного отличался от Matlab, но у меня сработало. - person Sujan; 19.07.2012
comment
Примите это как ответ, если это был ответ... Рад, что смог помочь. - person MoonKnight; 19.07.2012