Sparse setIdentity incorrect if matrix not compressed
Submitted by Iain
Assigned to Nobody
Link to original bugzilla bug (#1088)
Version: 3.2
Operating system: Linux
Description
Using setIdentity() on a sparse matrix leads to incorrect result if there are off-trace terms, i.e. there are still off-trace non-zero terms after setIdentity(). The setIdentity() function does not check if the matrix is in compressed form. Compressing the matrix seems to fix this issue on the test below.
MWE:
#include <iostream>
#define EIGEN_DONT_PARALLELIZE
#include <Eigen/Sparse>
using namespace std;
using namespace Eigen;
int main()
{
//Create 5x5 identity matrix
SparseMatrix<float> tmp(5,5);
tmp.setIdentity();
cout<<"Correct 5x5 identity:\n\n"<<tmp<<endl; // CORRECT
//Add a value off the trace
tmp.coeffRef(3,1) = 5.0;
//tmp.makeCompressed(); // UNCOMMENT TO FIX
cout<<"5x5 identity with additional off-trace value:\n\n"<<tmp<<endl;
//Reset to the identity
tmp.setIdentity();
cout<<"Incorrect 5x5 identity:\n\n"<<tmp<<endl; // INCORRECT !!!!!!
return 0;
}
Edited by Eigen Bugzilla