Разница между R и собственным3

Я выполняю следующее в R:

> m = matrix(c(0.563291, -0.478813,  0.574175,
+ 0.160779,  -0.03407,  0.381922,
+ 0.0677914,  0.870361,  -0.88602), 3, 3)
> mt = t(m)
> mt

[1,] 0.5632910 -0.478813  0.574175
[2,] 0.1607790 -0.034070  0.381922
[3,] 0.0677914  0.870361 -0.886020
> e<-eigen(mt)
> e
$values
[1] -1.1583554  0.5215205  0.2800359

$vectors

[1,] -0.3684057 0.8245987 -0.1255897
[2,] -0.2513624 0.4625355 -0.7915182
[3,]  0.8950387 0.3257267 -0.5981021

В eigen3 со следующим кодом С++:

std::cout << "=========" << std::endl;
std::cout << A << std::endl;

EigenSolver<MatrixXd> es(A);

std::cout << "evals: " << std::endl;
std::cout << es.eigenvalues();
std::cout << std::endl << "evecs: " << std::endl;
std::cout << es.eigenvectors() << std::endl;
std::cout << "=========" << std::endl;

Я получаю следующие значения:

=========
0.563291 -0.478813  0.574175
0.160779  -0.03407  0.381922
0.0677914  0.870361  -0.88602

evals: 
(0.521521,0)
(0.280036,0)
(-1.15836,0)
evecs: 
(-0.824599,0)  (0.125591,0) (-0.368406,0)
(-0.462535,0)  (0.791518,0) (-0.251362,0)
(-0.325726,0)  (0.598102,0)  (0.895039,0)
=========

Почему порядок в eigen3 отличается от порядка в R? Я ищу собственную версию для хранения и печати информации в формате «наивысшее собственное значение и соответствующий собственный вектор», что, по-видимому, и происходит, но почему несоответствие с R в собственных векторах в том, что он, кажется, печатает векторы как столбцы-векторы вместо векторов-строк со значениями, умноженными на -1?

Если я возьму вывод evs R и вывод evs Eigen и умножу их друг на друга, если они эквивалентны, я должен получить матрицу идентичности I, нет?

> v = matrix(c(-0.3684057, 0.8245987, -0.1255897,
+       -0.2513624, 0.4625355, -0.7915182,
+       0.8950387, 0.3257267, -0.5981021), nrow = 3, ncol = 3)
> v
           [,1]       [,2]       [,3]
[1,] -0.3684057 -0.2513624  0.8950387
[2,]  0.8245987  0.4625355  0.3257267
[3,] -0.1255897 -0.7915182 -0.5981021

> u = matrix(c(-0.824599, 0.125591, -0.368406,
+            -0.462535, 0.791518, -0.251362,
+            -0.325726,  0.598102, 0.895039), nrow = 3, ncol = 3)
> u
          [,1]      [,2]      [,3]
[1,] -0.824599 -0.462535 -0.325726
[2,]  0.125591  0.791518  0.598102
[3,] -0.368406 -0.251362  0.895039

> c = u*v
> c
          [,1]      [,2]       [,3]
[1,] 0.3037870 0.1162639 -0.2915374
[2,] 0.1035622 0.3661052  0.1948178
[3,] 0.0462680 0.1989576 -0.5353247

> u = t(u)
> u
          [,1]     [,2]      [,3]
[1,] -0.824599 0.125591 -0.368406
[2,] -0.462535 0.791518 -0.251362
[3,] -0.325726 0.598102  0.895039
> c = u*v
> c
            [,1]        [,2]        [,3]
[1,]  0.30378697 -0.03156886 -0.32973763
[2,] -0.38140576  0.36610517 -0.08187531
[3,]  0.04090783 -0.47340862 -0.53532471
> 

person Ivan    schedule 31.12.2014    source источник
comment
Векторы столбцов? Потому что так устроен R. Кроме того, собственные значения определены только с точностью до произвольного знака. Подумай об этом. Большинство функций векторных пространств сохраняются при зеркальном отображении.   -  person IRTFM    schedule 31.12.2014
comment
@BondedDust Вы имеете в виду, что собственные векторы определены только до произвольного знака?   -  person Matthew Lundberg    schedule 31.12.2014
comment
Может быть. Я думал, что это может быть любой из них. Если я ошибаюсь в этом аспекте матричной алгебры, это будет еще одна цепочка ошибок.   -  person IRTFM    schedule 31.12.2014
comment
Проблема заключается в выполнении автоматических тестов при сравнении собственного значения с выходом R.   -  person Ivan    schedule 01.01.2015
comment
Смотрите измененный пост. Я умножил вывод Eigen на вывод R и не получил матрицу идентичности I.   -  person Ivan    schedule 01.01.2015
comment
@Ivan Вам нужно отсортировать результаты так, чтобы собственные значения были в одном порядке для каждого метода.   -  person Matthew Lundberg    schedule 01.01.2015
comment
@Ivan Знак здесь может отличаться, потому что собственные векторы масштабируются до длины 1, а результаты реальны. Обратите внимание, что собственный вектор является репрезентативным. Любое скалярное кратное будет работать. Таким образом, вы можете проверить, что собственные векторы являются скалярными кратными друг другу, что охватывает случай, когда нет повторяющихся собственных значений.   -  person Matthew Lundberg    schedule 01.01.2015


Ответы (1)


Вы можете просто отсортировать их.

Для R в документации сказано

Value:

     The spectral decomposition of ‘x’ is returned as components of a
     list with components

  values: a vector containing the p eigenvalues of ‘x’, sorted in
          _decreasing_ order, according to ‘Mod(values)’ in the
          asymmetric case when they might be complex (even for real
          matrices).  For real asymmetric matrices the vector will be
          complex only if complex conjugate pairs of eigenvalues are
          detected.

Ничто не требует сортировки значений, это просто соглашение.

(И связанный с этим вопрос о знаках векторов также является квази-FAQ.)

person Dirk Eddelbuettel    schedule 31.12.2014
comment
Спасибо. Знаете ли вы, как я могу сделать собственную версию похожей на версию R с помощью простого вызова функции? Я знаю, что могу сделать это вручную - person Ivan; 31.12.2014
comment
Интересно также то, что мой R сортирует в возрастающем порядке, что, похоже, противоречит опубликованной вами документации. - person Ivan; 31.12.2014
comment
@Ivan - я думаю, ты просто неправильно это понимаешь? Предоставленные вами выходные данные перечислены в порядке убывания (обратите внимание, что они упорядочены на основе Mod (значения), как указано в документации - когда собственные значения являются реальными, это эквивалентно абсолютному значению). - person Dason; 31.12.2014
comment
Хорошо, спасибо, а как сделать, чтобы вывод eigen3 выглядел в точности как версия R? - person Ivan; 31.12.2014
comment
Написав код, который форматирует вывод в соответствии с вашей спецификацией. - person Dirk Eddelbuettel; 31.12.2014
comment
Включая выяснение знака собственных векторов? - person Ivan; 31.12.2014