Reputation: 71
I am using Eigen Sparse Matrices for the first time, and now I would like to know how to get the indices of the nonzero elements. I constructed my Sparse Matrix as follows:
Eigen::SparseMatrix<Eigen::ColMajor> Am(3,3);
and I can see some indices in VS by looking into the m_indices variable. But I can't access them. Can anyone please help me? For a Matrix like
( 1 0 1
0 1 1
0 0 0 )
I would like the indices to be like (0,0), (0,2), (1,1), (1,2)
.
Is there any way to do it?
P.S. My matrices are way bigger than 3x3.
Upvotes: 7
Views: 6819
Reputation: 6264
Using libigl's igl::find
, you can extract the indices of non-zeros into Eigen vectors:
Eigen::VectorXi I,J;
Eigen::VectorXd V;
igl::find(Am,I,J,V);
In your example these will contain:
I: 0 1 0 1
J: 0 1 2 2
V: 1 1 1 1
Upvotes: 0
Reputation: 1
Eigen::SparseMatrix<int, Eigen::ColMajor> A(2,3);
for (int k=0; k < A.outerSize(); ++k)
{
for (Eigen::SparseMatrix<int,Eigen::ColMajor>::InnerIterator it(A,k); it; ++it)
{
std::cout << "(" << it.row() << ","; // row index
std::cout << it.col() << ")\t"; // col index (here it is equal to k)
}
}
Upvotes: 0
Reputation: 10596
The tutorial has code similar to this:
for (int k=0; k < A.outerSize(); ++k)
{
for (SparseMatrix<int>::InnerIterator it(A,k); it; ++it)
{
std::cout << "(" << it.row() << ","; // row index
std::cout << it.col() << ")\t"; // col index (here it is equal to k)
}
}
Upvotes: 9