有效地更新特征中大型稀疏矩阵的某些块?

wuy*_*ng3 5 c++ sparse-matrix eigen eigen3

假设我有一个具有以下模式的大型稀疏矩阵:

  • 每列的非零数及其位置是固定的
  • 只有矩阵块 A 和 B 会发生变化,矩阵的其余部分保持不变;(块 A 和 B 本身也是稀疏的,具有固定的非零位置)

按照文档中的说明,我已通过以下方式初始化了上述矩阵

  • 为列主稀疏矩阵保留每列非零的确切数量
  • 逐列插入
  • 从每列的最小行索引插入

在程序的后面部分,很自然地会重用矩阵并仅就地更新 A、B 块。可能的方式有:

  1. 通过 , 访问现有条目coeffRef会引入二分搜索,因此此处不推荐使用。
  2. 迭代外部和内部维度,如此处记录

然而,似乎没有必要迭代所有非零条目,因为稀疏矩阵的大部分保持不变。

是否可以就地更新 A、B 而无需迭代矩阵中的所有非零值?

Hom*_*512 2

据我所知,InnerIterator可以用于此目的并以恒定的时间运行。

Eigen::Index col = 1;
Eigen::Index offset_in_col = 1;

using SparseMatrixD = Eigen::SparseMatrix<double>;
SparseMatrixD mat = ...;

SparseMatrixD::InnerIterator i =
      SparseMatrixD::InnerIterator(mat, col) + offset_in_col;
assert(i.row() == 1);
assert(i.col() == 1);
assert(i.value() == C);
Run Code Online (Sandbox Code Playgroud)

这应该访问值 C。您需要知道的是每列(或通常的内部维度)有多少个非零元素。您不需要知道存储了多少个非零列(外部维度),因为该数组 ( SparseMatrix.outerIndexPtr()) 每列有一个条目。