本征:如何从稀疏矩阵中删除初始化系数
Eigen: how to remove an initialised coefficient from a sparse Matrix
我正在写一个向后消除算法。在每次迭代中,我需要从 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
将当前列的某些系数设置为零后,您可以通过调用A.prune(0.0)
显式删除它们。参见各自的 doc.
但是,请注意,这将触发剩余列条目的昂贵内存副本。对于稀疏矩阵,我们通常不会就地工作。
我正在写一个向后消除算法。在每次迭代中,我需要从 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
将当前列的某些系数设置为零后,您可以通过调用A.prune(0.0)
显式删除它们。参见各自的 doc.
但是,请注意,这将触发剩余列条目的昂贵内存副本。对于稀疏矩阵,我们通常不会就地工作。