特征:如何从稀疏矩阵中删除初始化系数

时间:2015-11-02 09:59:40

标签: c++ eigen

我正在编写一个反向消除算法。在每次迭代中,我需要从SparseMatrix的列中消除一些系数并更新其他非零值。

但是,将对系数的引用更改为零不会解除分配,因此非零系数的数量是相同的。如何删除参考?我尝试使用makeCompressed()无效,编译器不知道修剪过。

以下基本代码。

我该如何解决这个问题?

#include <Eigen/SparseCore>
void nukeit(){
  Eigen::SparseMatrix<double> A(4, 3);
  cout << "non zeros of empty: " << A.nonZeros() << "\n" << endl;

  A.insert(0, 0) = 1;
  A.insert(2, 1) = 5;
  cout <<  "non zeros are two: " << A.nonZeros() << "\n" << endl;

  A.coeffRef(0, 0) = 0;
  cout <<  "non zeros should be one but it's 2: " << A.nonZeros() << "\n" << endl;

  cout <<  "However the matrix has only one non zero element\n" << A << endl;
}

输出

non zeros of empty: 0

non zeros are two: 2

non zeros should be one but it's 2: 2

However the matrix has only one non zero element
0 0 0 
0 0 0 
0 5 0 
0 0 0 

1 个答案:

答案 0 :(得分:3)

将当前列的某些系数设置为零后,您可以通过调用A.prune(0.0)显式删除它们。请参阅相应的doc

但是,请注意,这将触发剩余列条目的昂贵内存副本。对于稀疏矩阵,我们通常不会就地工作。