NUMPY (python) and ARMADILLO (c++) are giving different results

Viewed 194

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 ;    
}
0 Answers
Related