- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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
在内部,稀疏由四个紧凑数组组成:
Values
: stores the coefficient values of the non-zeros.InnerIndices
: stores the row (resp. column) indices of the non-zeros.OuterStarts
: stores for each column (resp. row) the index of the first non-zero in the previous two arrays.InnerNNZs
: stores the number of non-zeros of each column (resp. row). The word inner refers to an inner vector that is a column for a column-major matrix, or a row for a row-major matrix. The word outer refers to the other direction.
(参见 Sparse matrix manipulations)
您的矩阵存储为:
Values: 10 11
InnerIndices: 0 2
OuterStarts: 0 2 2
InnerNNZs: 2 0 0
引用手册:
Low-level API
sm1.valuePtr(); // Pointer to the values
sm1.innerIndexPtr(); // Pointer to the indices.
sm1.outerIndexPtr(); // Pointer to the beginning of each inner vector
因此,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/
我的稀疏矩阵数据已经在 CSR format 中了,即:我已经有非零值的数据(以 double[] 的形式),行和列索引(均以 int[] 的形式) 的非零值。 我的问题是,如何将它们直接分配给特征库
我正在使用 Eigen::SparseMatrix,但我无法理解 innerIndexPtr 和 outerIndexPtr 的含义。 the official page的解释对我来说很模糊。直觉上,
我是一名优秀的程序员,十分优秀!