Eigen Sparse value_Ptr显示零,同时省略有效值

时间:2014-08-06 20:06:17

标签: c++ c++11 eigen eigen3

当我尝试迭代稀疏矩阵的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

我不明白为什么我会得到零,这里发生了什么?

1 个答案:

答案 0 :(得分:3)

根据SparseMatrix的{​​{3}}:

  

与压缩格式不同,它之间可能存在额外的空间   两个连续列(分别为行)的非零值,以便插入   新的非零可以通过有限的内存重新分配和复制来完成。

     

[...]

     

对函数makeCompressed()的调用将矩阵转换为与许多库兼容的标准压缩格式。

documentation

  

在一个例子中更好地解释了这种存储方案。下列   基质

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数组的指针,除非你压缩矩阵,否则你会看到空格(打印的零)。