我正在使用 Eigen::SparseMatrix 并且我无法理解 innerIndexPtrouterIndexPtr 的含义。 the official page 的解释对我来说非常模糊。直觉上,我认为 innerIndexPtr 是非零元素的行索引,outerIndexPtr 是非零元素的列索引,但显然情况并非如此。请看下面的例子,

std::vector<Eigen::Triplet<double>> triplet;

triplet.emplace_back(0, 0, 10);
triplet.emplace_back(2, 0, 11);

Eigen::SparseMatrix<double> A(3, 3);

A.setFromTriplets(triplet.begin(), triplet.end());

std::cout << A.innerIndexPtr()[0] << std::endl; // prints 0
std::cout << A.innerIndexPtr()[1] << std::endl; // prints 2
std::cout << std::endl;
std::cout << A.outerIndexPtr()[0] << std::endl; // prints 0
std::cout << A.outerIndexPtr()[1] << std::endl; // prints 2, but I thought it should print 0
std::cout << std::endl;
std::cout << A.valuePtr()[0] << std::endl; // prints 10
std::cout << A.valuePtr()[1] << std::endl; // prints 11

有人可以向我解释 innerIndexPtrouterIndexPtr 到底代表什么吗?

最佳答案

你的矩阵看起来像这样:

    (0) (1) (2)
(0)  10   0   0
(1)   0   0   0
(2)  11   0   0

在内部,稀疏由四个紧凑数组组成:



(见 Sparse matrix manipulations )

您的矩阵存储为:

      Values: 10 11
InnerIndices:  0  2

 OuterStarts:  0  2  2
   InnerNNZs:  2  0  0

引用手册:



因此, valuePtr() 返回 [10, 11]innerIndexPtr() 返回 [0, 2]outerIndexPtr() 返回 [0, 2, 2] 。这应该可以解释您观察到的结果。

关于 OuterStarts 数组的一些解释:编号为 1 和 2 的列由零组成。这不会影响外部索引。编号为 1 的列从位置 2 开始并在位置 2 结束。编号为 2 的列也从位置 2 开始并在位置 2 结束。它们完全由零组成的事实仅意味着它们是零大小的。我同意手册中对 OuterStarts 的解释有点误导。将“第一个非零”视为过去的元素。

关于c++ - 对于 Eigen SparseMatrix,innerIndexPtr() 和 outerIndexPtr() 究竟代表什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57367167/

10-11 18:43