稀疏矩阵Eigen如何获取非零元素的索引

7

我第一次使用Eigen稀疏矩阵,现在我想知道如何获取非零元素的索引。 我构建了如下稀疏矩阵:

Eigen::SparseMatrix<Eigen::ColMajor> Am(3,3);

我可以通过查看m_indices变量在VS中看到一些指数。但是我无法访问它们。有人可以帮帮我吗? 对于像Matrix这样的

( 1 0 1 
  0 1 1
  0 0 0 )

我希望索引能像这样:(0,0), (0,2), (1,1), (1,2)
有没有办法做到这一点?
附注:我的矩阵比3x3大得多。
3个回答

8

这个教程中有类似于以下代码的内容:

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)
    }
}

你有什么想法,为什么会出现“Eigen :: SparseCompressedBase <Derived> :: InnerIterator :: InnerIterator(const Eigen :: SparseMatrixBase <OtherDerived>&,Eigen :: Index)[with T = Eigen :: SparseMatrix <int,1>; Derived = Eigen :: SparseMatrix <int>; Eigen :: Index = long int]”这个错误?因为InnerIterator是私有的。 - lucidbrot
2
找到了为什么会出现那个错误:我没有指定要使用RowMajor。改用SparseMatrix<int,Eigen::RowMajor>::InnerIterator就可以了! - lucidbrot

0

使用libigl的igl::find,您可以将非零元素的索引提取到Eigen向量中:

Eigen::VectorXi I,J;
Eigen::VectorXd V;
igl::find(Am,I,J,V);

在你的例子中,它们将包含:

I: 0 1 0 1
J: 0 1 2 2
V: 1 1 1 1

0
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)
    }
}

1
你好,欢迎来到Stack Overflow,感谢您的回答。与其只发布一大块代码,您能否简要说明您解决的问题以及如何解决它?这将有助于未来遇到此类问题的人更好地理解问题及其解决方法。 - Plutian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接