我正在使用 Eigen::SparseMatrix 并且我无法理解 innerIndexPtr
和 outerIndexPtr
的含义。 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
有人可以向我解释
innerIndexPtr
和 outerIndexPtr
到底代表什么吗? 最佳答案
你的矩阵看起来像这样:
(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/