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

C++ 特征:如何从稀疏矩阵中删除初始化系数,c++,eigen,C++,Eigen,我正在写一个反向消除算法。在每次迭代中,我需要从SparseMatrix的列中删除一些系数,并更新其他非零系数 但是,将对系数的引用更改为零并不会取消分配它,因此非零系数的数量是相同的。如何删除引用?我使用makeCompressed()进行了尝试,但没有效果,编译器不知道是否已修剪 基本代码如下 我怎样才能解决这个问题 #include <Eigen/SparseCore> void nukeit(){ Eigen::SparseMatrix<double> A(4

我正在写一个反向消除算法。在每次迭代中,我需要从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;
}

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


但是,请注意,这将触发剩余列条目的昂贵内存拷贝。对于稀疏矩阵,我们通常不会在适当的位置工作。

我注意到在计算科学论坛上有几个贴有“eigen”标签的帖子:也许你也可以在那里发布?@Baruchel答案不多,但有一个很好的提示:-)谢谢!我在那里找到了stackoverflow上一篇帖子的链接。解决方案非常简单。如果
A.prune(0)
无法编译,请尝试
A.prune(0.0)
。是的,我在您响应时找到了它。非常感谢。实际上,
A.prune(0)
给出了一个奇怪的编译器错误。prune(0.0)很有效。@ggael嗨,我很高兴找到了一个解决方案,以至于忽略了你答案的第二部分。我不明白你说的“不到位”是什么意思。你能建议一个更好的方法吗?
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