当我尝试迭代稀疏矩阵的valuePtr
时,我不明白我得到的结果。这是我的代码。
#include <iostream>
#include <vector>
#include <Eigen/Sparse>
using namespace Eigen;
int main()
{
SparseMatrix<double> sm(4,5);
std::vector<int> cols = {0,1,4,0,4,0,4};
std::vector<int> rows = {0,0,0,2,2,3,3};
std::vector<double> values = {0.2,0.4,0.6,0.3,0.7,0.9,0.2};
for(int i=0; i < cols.size(); i++)
sm.insert(rows[i], cols[i]) = values[i];
std::cout << sm << std::endl;
int nz = sm.nonZeros();
std::cout << "non_zeros : " << nz << std::endl;
for (auto it = sm.valuePtr(); it != sm.valuePtr() + nz; ++it)
std::cout << *it << std::endl;
return 0;
}
Output:
0.2 0.4 0 0 0.6 // The values are in the matrix
0 0 0 0 0
0.3 0 0 0 0.7
0.9 0 0 0 0.2
non_zeros : 7
0.2 // but valuePtr() does not point to them
0.3 // I expected: 0.2, 0.3, 0.9, 0.4, 0.6, 0.7, 0.2
0.9
0
0.4
0
0
我不明白为什么我会得到零,这里发生了什么?
答案 0 :(得分:3)
根据SparseMatrix
的{{3}}:
与压缩格式不同,它之间可能存在额外的空间 两个连续列(分别为行)的非零值,以便插入 新的非零可以通过有限的内存重新分配和复制来完成。
[...]
对函数
makeCompressed()
的调用将矩阵转换为与许多库兼容的标准压缩格式。
在一个例子中更好地解释了这种存储方案。下列 基质
0 3 0 0 0 22 0 0 0 17 7 5 0 1 0 0 0 0 0 0 0 0 14 0 8
和其中一个可能的稀疏列主要表示:
Values: 22 7 _ 3 5 14 _ _ 1 _ 17 8 InnerIndices: 1 2 _ 0 2 4 _ _ 2 _ 1 4
[...]
&#34; _&#34;表示可用空间以快速插入新元素。
由于valuePtr()
只是返回一个指向Values
数组的指针,除非你压缩矩阵,否则你会看到空格(打印的零)。