Библиотека линейной алгебры C ++ броненосец: как использовать eig_pair для получения того же результата, что и функция eig в Matlab?

Я пытаюсь использовать eig_pair, чтобы получить разложение по Eigen для пары общих плотных квадратных матриц A и B одинакового размера, так что A * eigvec = B * eigvec * diagmat (eigval), но результат не соответствует функции ela Matlab , например:

A= [1,2;3,4]     B=[2,4;5,8]

в Matlab:

[u,v] = eig(A,B)

результат:

u =

-1.0000   -0.0000

0.5000   -1.0000

v =

1.0000         0
0    0.5000

в броненосце:

eig_pair(v,u,A,B)

результат:
и:

9.9301e-016     -1.0000e+000

1.0000e+000      5.0000e-001

v:

0.5000

1.0000

Мой вопрос: как получить значения u и v, которые соответствуют результатам в Matlab?
Ждем вашего ответа !!!

1

Решение

Собственные векторы не уникальны. Если U является собственным вектором, так это м * U для всех м! = 0. Кроме того, порядок, eig возвращает собственные векторы в Matlab произвольно. (Я не знаю, в каком порядке Армадилло возвращает собственные векторы.) Вы мог попытайтесь создать канонический порядок для собственных векторов путем сортировки собственных значений, но это проблематично, если у вас есть сложные собственные значения. (Напомним, что реальные матрицы могут иметь сложные собственные значения.)

Таким образом, (-1.0000, 0.5000) (первый столбец U в Matlab) является тем же собственным вектором, что и (-1.0000e + 000, 5.0000e-001) (второй столбец U в броненосце). Так же, (-0,0000, -1,0000) эквивалентно (9.9301e-016, 1.0000e + 000) когда вы масштабируете на -1 и учитываете ошибки с плавающей запятой. Обратите внимание, что возможны ошибки числовой точности, которые могут привести к тому, что значения с плавающей запятой будут сравниваться не одинаково, даже если математически числа являются равны.

Если вы хотите каноническое представление собственных векторов, вы можете изменить их масштаб, чтобы иметь норму 1, а также умножить на -1, если знак первого элемента отрицательный. Конечно, если первый элемент в собственном векторе близок к 0, это опять-таки проблематично, так как значение могло оказаться только с неправильной стороны нуля по численным причинам. Так что если подумать, может быть лучше убедиться, что самый большой элемент (после нормализации), а не первый, является положительным.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector