Почему некоторые собственные векторные знаки из C++ Armadillo отличаются от Python и R

Мне было интересно, почему знак элементов в собственных векторах из Armadillo является противоположным от других языков, таких как Python (то есть numpy) и R.

Например:

C++

using namespace arma;

vec eigval;
mat eigvec;

// C++11 initialization
mat A = { 1, -1, 0, -1, 2, -1, 0, -1, 1};

eig_sym(eigval, eigvec, A);
eigvec.print("Eigen Vectors");

Выход

Eigen Vectors
-5.7735e-01  -7.071068e-01  0.4082483
-5.7735e-01  9.714451e-e17  -0.8164966
-5.7735e-01  7.017068e-01   0.4082483

питон

import numpy as np
w,v = np.linalg.eig(np.array([[1,-1,0],[-1,2,-1],[0,-1,1]]))
v 

Выход

array([[ -4.08248290e-01,  -7.07106781e-01,   5.77350269e-01],
       [  8.16496581e-01,   2.61214948e-16,   5.77350269e-01],
       [ -4.08248290e-01,   7.07106781e-01,   5.77350269e-01]])

р

eigen(matrix(c(1,-1,0,-1,2,-1,0,-1,1), 3, byrow=TRUE)$vectors

Выход

-4.082483e-01  -7.071068e-01   5.773503e-01
 8.164966e-01   9.420555e-16   5.773503e-01
-4.082483e-01   7.071068e-01   5.773503e-01

Вы можете видеть, что Python и R предоставляют одинаковые собственные векторы (исключая ошибки округления). Результат броненосца дает те же числа (порядок - это простое исправление), но знак в первом и третьем столбцах противоположен соответствующим столбцам в Python и R. Я что-то пропускаю здесь?

1 ответ

Решение

Что ответили help(eigen) в 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.

 vectors: either a p * p matrix whose columns contain the eigenvectors
          of ‘x’, or ‘NULL’ if ‘only.values’ is ‘TRUE’.  The vectors
          are normalized to unit length.

          Recall that the eigenvectors are only defined up to a
          constant: even when the length is specified they are still
          only defined up to a scalar of modulus one (the sign for real
          matrices).

Таким образом, знак является "свободным" параметром, и результат действительно эквивалентен. Если бы это был я, я бы последовал за R и Python, но Конрад обычно знает, что он делает.

Вы не используете хорошую функцию (ваша функция предназначена для симметричного Martix)

A << 1. << -1. << 0. <<endr
  << -1. << 2. << -1. <<endr
  <<  0. << -1. << 1. <<endr;

A.print("A :");
eig_gen(eigval, eigvec, A);
eigval.print("eigval");
eigvec.print("eigvec");

и OutPut:

A :
   1.0000  -1.0000        0
  -1.0000   2.0000  -1.0000
        0  -1.0000   1.0000
eigval
    (+3.000e+00,+0.000e+00)
    (+1.000e+00,+0.000e+00)
    (-3.368e-17,+0.000e+00)
eigvec
   (-4.082e-01,+0.000e+00)    (-7.071e-01,+0.000e+00)    (+5.774e-01,+0.000e+00)
   (+8.165e-01,+0.000e+00)    (+2.612e-16,+0.000e+00)    (+5.774e-01,+0.000e+00)
   (-4.082e-01,+0.000e+00)    (+7.071e-01,+0.000e+00)    (+5.774e-01,+0.000e+00)
Другие вопросы по тегам