C++ 设置负元素本征稀疏系数C++;

C++ 设置负元素本征稀疏系数C++;,c++,eigen,eigen3,C++,Eigen,Eigen3,将本征SparseVector中的所有负值设置为零的最有效方法是什么 我有一个SparseVector,包含大约1000000个元素,其中包含很少的非零条目。我需要把负数设为零。在整个向量上迭代需要花费太多的时间。有更有效的方法吗?用于(Eigen::SparseVector::InnerIterator it(fullScan);it;++it){ for (Eigen::SparseVector<double, Eigen::RowMajor>::InnerIterator it

将本征SparseVector中的所有负值设置为零的最有效方法是什么

我有一个SparseVector,包含大约1000000个元素,其中包含很少的非零条目。我需要把负数设为零。在整个向量上迭代需要花费太多的时间。有更有效的方法吗?

用于(Eigen::SparseVector::InnerIterator it(fullScan);it;++it){
for (Eigen::SparseVector<double, Eigen::RowMajor>::InnerIterator it(fullScan); it; ++it) {
    if (it.value() < 0) {
        fullScan.coeffRef(it.index()) = 0;
    }
}
if(it.value()<0){ fullScan.coeffRef(it.index())=0; } }
对于
SparseMatrix
您实际上可以将
prune
与自定义functor一起使用(对于应保留的值,必须返回true):


不确定为什么SparseVector无法使用此功能。

在加载向量时重新映射。我是一个新手。你们会怎么做呢?一旦你们删除了负的非零项,你们能用矩阵的压缩形式工作吗?如果是这样的话,也许
prune()
可以帮助您。正如dfri所写的,方法
prune()
就是您正在寻找的,很容易在.ah right中找到。仅
SparseMatrix::prune
支持自定义谓词:
mat.prune([](双x){然后您可以调用
fullScan.prune(0.0);
删除它们,否则
fullScan
仍将包含显式零。这正是我所做的。我只是没有在这里的代码段中包含它。
mat.prune([](int, int, const double& val) { return val >= 0.0; });