Eigen用三元组填充稀疏RowMajor矩阵

时间:2017-06-21 15:43:43

标签: c++ sparse-matrix eigen

我正在尝试填充Sparse RowMajor矩阵。按照指南我使用三元组方法:

Eigen::SparseMatrix<double, Eigen::RowMajor> data_matrix(rows, cols);
....

void get_data(const char *dir_name, std::vector<T> tripletList, Eigen::SparseMatrix<double, Eigen::RowMajor> data_matrix) {
uint64_t row_iter = 0;

for (std::string file_n : sorted_files) {
   ...
   if (words.find(word_freq[0]) != words.end())
       tripletList.push_back(T(row_iter, words[word_freq[0]], std::stoi(word_freq[1])));
   }

   row_iter++;

}

data_matrix.setFromTriplets(tripletList.begin(), tripletList.end());

但是,这种方法会生成一个空矩阵。我无法找到使用三元组列表方法填充RowMajor矩阵的示例,这是不可能的?

1 个答案:

答案 0 :(得分:1)

适合我,这是一个自给自足的例子:

#include <iostream>
#include <Eigen/SparseCore>
#include <vector>
using namespace Eigen;
using namespace std;

int main()
{
  int m = 3, n = 7;
  SparseMatrix<double, RowMajor> M(m,n);
  typedef Triplet<double,int> T;
  vector<T> entries;
  for(int k=1; k<=9;++k)
    entries.push_back( T(internal::random<int>(0,m-1), internal::random<int>(0,n-1), k) );
  M.setFromTriplets(entries.begin(), entries.end());
  cout << MatrixXd(M) << "\n";
}

产生:

 1  0  0  8  4  0  0
 0  3  0  6  0  0  0
16  0  0  2  0  0  5

修改

所以问题在于你的代码结构,我看到get_data按值获取三元组列表和稀疏矩阵,而它们被这个函数修改,所以你很可能想要通过它们参考