【问题标题】:Iterating over symmetric sparse matrix in Eigen在 Eigen 中迭代对称稀疏矩阵
【发布时间】:2018-06-25 04:38:41
【问题描述】:

我正在按照以下示例循环遍历稀疏矩阵的元素。

SparseMatrix<double> mat(rows,cols);
for (int k=0; k<mat.outerSize(); ++k)
  for (SparseMatrix<double>::InnerIterator it(mat,k); it; ++it)
  {
    it.value();
    it.row();   // row index
    it.col();   // col index (here it is equal to k)
    it.index(); // inner index, here it is equal to it.row()
  }

这个例子我完全没问题。但是,我拥有的矩阵是对称的,我只想遍历下部。有什么简单的方法可以遍历对称矩阵吗?

【问题讨论】:

  • 为什么不能迭代内部循环直到it.row() &gt; k(或者它到达末尾)?
  • @MFisherKDX 是的,我认为这是一种简单的方法。但唯一的小问题是内部循环仍然会经过列的上半部分,直到 it.row() > k

标签: c++ sparse-matrix eigen


【解决方案1】:

您可以在每个循环开始时检查它:

for (int k=0; k<mat.outerSize(); ++k)
  for (SparseMatrix<double>::InnerIterator it(mat,k); it; ++it)
  {
      if(it.row() < it.col())
          continue;
  }

【讨论】:

  • 是的,你是对的!我正在尝试 SparseMatrix::InnerIterator it(mat,k) + k。但这没有用。感谢您的回答!
  • 第一个选项有问题吗? it.row() >= it.col() 当上半部分包含非零值时,这会使内部循环中断吗?
  • 为什么非零值与它有任何关系?如果我们写了 ‘&& !it.value()’ 那么是的,但我们没有。
  • 考虑一个矩阵,比如 [1 2; 2 1] 和第 0 行第 1 列中的元素 2。当它看到这个 2 时,内部循环将中断,因为 0
  • 不,这 2 只能作为 it.value() 访问,并且在循环中,我们只检查 it.row() 和 it.col(),它们返回索引。
猜你喜欢
  • 2023-03-16
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多