I have a double matrix as:
M =[ [1.0000e+00, 0, 0, 0,-6.5919e-17, 2.8284e-01],
[ 0 , 1.0000e+00, 0, 0, 2.8284e-01,-7.6328e-17],
[ 0 , 0, 1.0000e+00, 2.8284e-01, 0, 0],
[ 0 , 0, 2.8284e-01, 1.0000e+00, 0, 0],
[-6.5919e-17 , 2.8284e-01, 0, 0, 1.0000e+00, 0],
[ 2.8284e-01 ,-7.6328e-17, 0, 0, 0, 1.0000e+00]]
When I diagonalize it with arma::eig_sym() with g++ -std=c++17 test.cpp -larmadillo I get eigenvectors as:
Arma EigVec :
5.0000e-01 -1.9854e-32 5.0000e-01 -5.3490e-01 4.6247e-01 1.9854e-32
-5.0000e-01 -7.3570e-17 5.0000e-01 -4.6247e-01 -5.3490e-01 7.3570e-17
0 7.0711e-01 0 0 0 7.0711e-01
0 -7.0711e-01 -5.5511e-17 5.5511e-17 1.1102e-16 7.0711e-01
5.0000e-01 -1.9854e-32 -5.0000e-01 -4.6247e-01 -5.3490e-01 1.9854e-32
-5.0000e-01 0 -5.0000e-01 -5.3490e-01 4.6247e-01 0
But when I diagonalize it with numpy.linalg.eigh, I get different results, although the eigenvalues are the same. Here is numpy output:
Numpy EigVec =
+0.2483 +0.0000 +0.6621 +0.3467 +0.0000 +0.6163
+0.6621 +0.0000 +0.2483 +0.6163 +0.0000 +0.3467
+0.0000 +0.7071 +0.0000 +0.0000 +0.7071 +0.0000
+0.0000 +0.7071 +0.0000 +0.0000 +0.7071 +0.0000
+0.6621 +0.0000 +0.2483 +0.6163 +0.0000 +0.3467
+0.2483 +0.0000 +0.6621 +0.3467 +0.0000 +0.6163
Any help to understand this discrepancy is very appreciated in advance :)
PS: I am using armadillo v10.2, numpy v1.20, and python 3.8.5 and here is my codes:
import numpy as np
from numpy.linalg import eigh as LA
Re = [[1.0000e+00, 0, 0, 0,-6.5919e-17, 2.8284e-01],
[ 0 , 1.0000e+00, 0, 0, 2.8284e-01,-7.6328e-17],
[ 0 , 0, 1.0000e+00, 2.8284e-01, 0, 0],
[ 0 , 0, 2.8284e-01, 1.0000e+00, 0, 0],
[-6.5919e-17 , 2.8284e-01, 0, 0, 1.0000e+00, 0],
[ 2.8284e-01 ,-7.6328e-17, 0, 0, 0, 1.0000e+00]]
H = np.array(Re)
_ , H = LA(H)
print("Numpy EigVec = ")
for i in range(H.shape[0]):
for j in range(H.shape[0]):
print("{:+.4f}\t\t".format(H[i,j]),end="")
print()
#include <iostream>
#include <complex>
#include <armadillo>
#include <vector>
#define N 6
using namespace std ;
int main(){
vector<vector<double>> Re{
{1.0000e+00 , 0, 0, 0,-6.5919e-17, 2.8284e-01},
{ 0 , 1.0000e+00, 0, 0, 2.8284e-01,-7.6328e-17},
{ 0 , 0, 1.0000e+00, 2.8284e-01, 0, 0},
{ 0 , 0, 2.8284e-01, 1.0000e+00, 0, 0},
{-6.5919e-17 , 2.8284e-01, 0, 0, 1.0000e+00, 0},
{ 2.8284e-01 ,-7.6328e-17, 0, 0, 0, 1.0000e+00}};
arma::Mat<double> H(N,N,arma::fill::zeros);
for(size_t i=0;i<N;i++){for(size_t j=0;j<N;j++){H(i,j)=Re[i][j];}}
arma::Col<double> e;
arma::eig_sym(e,H,H);
H.print("Arma EigVec : ") ;
return 0 ;
}