簡體   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