删除Eigen :: SparseMatrix

时间:2018-06-05 16:36:38

标签: sparse-matrix eigen

我已经从三元组列表中构建了一个稀疏矩阵mat

Eigen::SparseMatrix<double, Eigen::RowMajor> mat(Nbins,Ndata);
mat.setFromTriplets(tripletList.begin(), tripletList.end());

现在我想创建一个新的矩阵ret,它只包含前一个矩阵的非空行。我这样做如下

Eigen::SparseMatrix<double, Eigen::RowMajor> ret(Nbins,Ndata);
unsigned Nrow=0;
for (unsigned i=0; i<Nbins; ++i) {
  auto mrow = mat.row(i);
  if (mrow.sum()>0) {
    ret.row(Nrow++) = mrow;
  }
}
ret.conservativeResize(Nrow,Ndata);

然而,这样做是缓慢而低效的。慢,因为快速分析表明它大部分时间花在ret.row(Nrow++) = mrow;上。效率低,因为我们也在两次复制所有数据。

有更好的解决方案吗?我觉得有人必须摆弄内心的向量,但我对它们感到困惑,而且我不知道如何使用它们进行用户验证。

编辑:在我的应用程序中,矩阵是行主,我想删除空行。仅mat不需要ret。所有系数都是正数因此我检查非零行的方式。三元组是按类别排列的。没有重复的三胞胎。

1 个答案:

答案 0 :(得分:1)

发现它!我没有写一个手工制作的setFromTriplets,而是修改了tripletList。 Eigen :: Triplet的界面非常简单。

numbers_atoms(Numbers, Atoms) :-
    maplist(atom_number, Atoms, Numbers).