繁体   English   中英

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

[英]efficiently updating inplace certain blocks of a large sparse matrix in Eigen?

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

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

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

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

在程序的后面部分,很自然地重用矩阵并且只更新 A、B 块。 可能的方法是:

  1. 通过coeffRef访问现有条目会引入二进制搜索,因此这里不推荐使用。
  2. 迭代此处记录的外部和内部尺寸

但是,似乎没有必要遍历所有非零条目,因为稀疏矩阵的大部分都保持不变。

是否可以在不迭代矩阵中的所有非零值的情况下就地更新 A、B?

据我所知, 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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM