c++matrixeigensparse-matrixtriplet

Convert an Eigen matrix to Triplet form C++


I think Eigen uses compressed methods to store sparse matrices. Is there any way that I can extract Triplet-format vectors of an Eigen sparse matrix in from of std::vectors?

Thanks.

More info (an example of triplet format) Triplet format of matrix :

A=
3 0 4 0
0 0 1 0
0 2 0 5
4 0 0 0

i = 1 1 2 3 3 4  // row
j = 1 3 3 2 4 1 // column
S = 3 4 1 2 5 4  // values

Solution

  • Simply as shown in the tutorial:

    #include <Eigen/Sparse>
    #include <iostream>
    
    using namespace Eigen;
    using std::cout;
    using std::endl;
    
    typedef Triplet<int> Trip;
    
    int main(int argc, char *argv[]){
    
        std::vector<Trip> trp, tmp;
    
        // I subtracted 1 from the indices so that the output matches your question
        trp.push_back(Trip(1-1,1-1,3));
        trp.push_back(Trip(1-1,3-1,4));
        trp.push_back(Trip(2-1,3-1,1));
        trp.push_back(Trip(3-1,2-1,2));
        trp.push_back(Trip(3-1,4-1,5));
        trp.push_back(Trip(4-1,1-1,4));
    
        int rows, cols;
        rows = cols = 4;
        SparseMatrix<int> A(rows,cols);
    
        A.setFromTriplets(trp.begin(), trp.end());
        cout << "Matrix from triplets:" << endl;
        cout << A << endl;            
    
        cout << endl << "Triplets:" << endl;
        cout << "Row\tCol\tVal" <<endl;
        for (int k=0; k < A.outerSize(); ++k)
        {
            for (SparseMatrix<int>::InnerIterator it(A,k); it; ++it)
            {
                cout << 1+it.row() << "\t"; // row index
                cout << 1+it.col() << "\t"; // col index (here it is equal to k)
                cout << it.value() << endl;
            }
        }
    
        return 0;
    }