Собственный вектор и собственное значение матрицы 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];
}
}
}
Я знаю, что это неправильно, но не могу понять это. Мне нужна помощь для использования силового метода или, возможно, более эффективного способа его расчета.
Заранее спасибо.
1 ответ
Извлечение собственных значений / собственных векторов эффективным способом (т.е. быстрым!) Для матрицы любого размера (плотной) не совсем тривиально. Я бы посоветовал вам использовать что-то вроде алгоритма QR (хотя это может быть излишним для одноразового расчета одной матрицы 8x8).
Алгоритм QR вычисляет разложение по Шуру матрицы. Это, безусловно, один из самых важных алгоритмов в вычислениях собственных значений. Однако он применяется только для плотных матриц (как указано выше).
Алгоритм QR состоит из двух отдельных этапов. Во-первых, посредством преобразования подобия исходная матрица преобразуется за конечное число шагов в форму Гессенберга или - в эрмитовом / симметричном случае - в вещественную трехдиагональную форму. Этот первый этап алгоритма готовит свой второй этап, фактические итерации QR, которые применяются к матрице Гессенберга или трехдиагональной.
Общая сложность (число с плавающей запятой) алгоритма составляет O(n3). Хорошее объяснение этого алгоритма смотрите здесь. Или поиск алгоритма собственных значений в Google должен предоставить вам много альтернативных способов вычисления ваших требуемых собственных значений / векторов.
Кроме того, я не рассматривал это подробно, но Math.NET бесплатная библиотека может помочь вам здесь...