c++ - 特征:稀疏矩阵 pruned() 不会删除低于阈值的条目

标签 c++ eigen matrix-multiplication eigen3

我想使用 Eigen 进行稀疏矩阵乘法,在每次迭代中我想删除低于特定阈值的所有条目。在我看来,Eigen 只删除完全等于零的元素。

我正在运行 Eigen 3.3.7,使用 g++ 编译。

#include <Eigen/Sparse>
#include <Eigen/Dense>
#include <iostream>

using namespace Eigen;
typedef SparseMatrix<double> CscMat;            
typedef SparseMatrix<double,RowMajor> CsrMat;    

int N = 4;
CsrMat S, S2;

MatrixXd D(N, N), D2(N,N);
D << 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;
D *= 0.1;

S = D.sparseView(0.5);
std::cout << D  << std::endl;
std::cout << S.nonZeros()  << std::endl;

D2 = D;
D2 = (D2.array() < 0.5).select(0, D2);
S2 = D2.sparseView();
std::cout << D  << std::endl;
std::cout << S2.nonZeros() << std::endl;

上面的 S.nonzeros() 返回 16,而不是像 S2.nonzeros() 中预期的 12。

输出为:

0.1 0.2 0.3 0.4
0.5 0.6 0.7 0.8
0.9   1 1.1 1.2
1.3 1.4 1.5 1.6
16

  0   0   0   0
0.5 0.6 0.7 0.8
0.9   1 1.1 1.2
1.3 1.4 1.5 1.6
12

最佳答案

sparseView 还有第二个参数,即 reference。最后,两者的乘积将确定阈值,因此您应该使用以下行:

S = D.sparseView(0.5, 1.0 - std::numeric_limits<double>::epsilon());

获得你似乎想要的东西。

执行评估的实际代码位于 MathFunctions.h

static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, 
                                     const RealScalar& prec)
{
   return numext::abs(x) <= numext::abs(y) * prec;
}

其中 double 类型的默认 prec 为(当前)1e-12

关于c++ - 特征:稀疏矩阵 pruned() 不会删除低于阈值的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55096911/

相关文章:

c++ - 线程矩阵乘法函数

c++ - 为什么我的缓冲区占用的字节数超过允许的字节数?

c++ - typedef 的编译器相关错误

c++ - c++ 中有没有办法不为项目的特定部分生成调试信息?

c++ - 如何将 Eigen 矩阵和 vector 类型转换为 Apple 的 simd 类型以传递给 GPU?

java - 计算矩阵指数的乘法和

当我调用脚本并让脚本保持运行时,C++ 应用程序在退出时挂起

c++ - 如何从给定日期找到星期几 `tm_wday`?

c++ - 找到稀疏矩阵( Eigen )最大值的有效方法

matrix-multiplication - 双重轮廓和二次误差函数