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