Почему некоторые собственные векторные знаки из 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]])

R

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. Я что-то здесь упустил?


person cdeterman    schedule 04.03.2015    source источник
comment
Если v — собственный вектор, то av (a — действительное число) также является собственным вектором. Обычное соглашение состоит в том, чтобы их нормализовать, но в то же время они могут указывать в любом из двух возможных направлений.   -  person 463035818_is_not_a_number    schedule 04.03.2015
comment
Если вы умножаете собственный вектор на скаляр, он остается собственным вектором с тем же собственным значением. Таким образом, не имеет значения, отличаются ли собственные векторы постоянным множителем, если они не равны нулю.   -  person Baum mit Augen    schedule 04.03.2015


Ответы (2)


На это отвечает 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, но Конрад обычно знает, что делает.

person Dirk Eddelbuettel    schedule 04.03.2015
comment
Спасибо, Дирк, я просто пытаюсь понять, как назначается этот параметр «свободный знак». Я создаю некоторые функции в R для использования броненосца, и я хочу убедиться, что вывод эквивалентен R. Могу ли я просто игнорировать знак и называть их эквивалентными? - person cdeterman; 04.03.2015
comment
Не вижу причин не делать этого. - person Dirk Eddelbuettel; 04.03.2015

вы не используете хорошую функцию (ваша функция предназначена для симметричного 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");

и выход:

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)
person user11906116    schedule 09.08.2019