SelfAdjointEigenSolver incorrect with RowMajor matrices
Submitted by tyl..@..oo.com
Assigned to Nobody
Link to original bugzilla bug (#1062)
Version: 3.2
Operating system: Linux
Description
SelfAdjointEigenSolver gives different results if used with row major or column major matrices.
The differences seem to increase with the dimension of the matrix.
The type also has an influence: floats give results worse than double.
Complex floats are even worse.
I also noted differences while using ComplexEigenSolver, but they are smaller.
Here is a code sample to illustrate the problem:
#include<iostream>
#include "Eigen/Dense"
using namespace Eigen;
using namespace std;
int main() {
typedef float mytype ;
typedef Matrix<complex<mytype>, Dynamic, Dynamic> EigMatCM;
typedef Matrix<complex<mytype>, Dynamic, Dynamic, RowMajor> EigMatRM;
int d = 20;
EigMatCM X = EigMatCM::Random(d,d);
EigMatCM A = X + X.transpose().conjugate();
SelfAdjointEigenSolver<EigMatCM> es(A);
EigMatRM Xr = X;
EigMatRM Ar = Xr + Xr.transpose().conjugate();
SelfAdjointEigenSolver<EigMatRM> esr(Ar);
cout<<es.eigenvalues()-esr.eigenvalues()<<endl;
}
I compared the output to the one given by numpy.linalg.eig function, and only the row major version seems to give incorrect results.