本征稀疏向量:求最大系数

时间:2018-10-16 04:49:30

标签: c++ max sparse-matrix eigen

我正在使用Eigen处理稀疏向量,因此我需要找到一种有效的方法来计算最大系数(或第n个最大系数)的索引。

我的初始方法使用Eigen :: SparseVector :: InnerIterator,但是在矢量仅包含零和负值的情况下,它不会计算正确的值,因为InnerIterator仅迭代非零值。

如何实现它以便考虑零值?

2 个答案:

答案 0 :(得分:0)

与内部迭代器同时迭代索引数组(我认为是innerIndices)。

答案 1 :(得分:0)

要获取最大的非零元素的索引,可以使用以下函数:

Eigen::Index maxRow(Eigen::SparseVector<double> const & v)
{
    Eigen::Index nnz = v.nonZeros();
    Eigen::Index rowIdx;
    double value = Eigen::VectorXd::Map(v.valuePtr(), nnz).maxCoeff(&rowIdx);
    // requires special handling if value <= 0.0
    return v.innerIndexPtr()[rowIdx];
}

value <=0(和v.nonZeros()<v.size())的情况下,您可以遍历innerIndexPtr()直到找到连续元素之间的间隔(或使用std::lower_bound编写更复杂的内容)< / p>

要获得第n个最大元素,取决于n与向量大小的相对大小,具有多少非零值,是否可以修改SparseVector等。

特别是,如果n相对较大,请考虑将partition的元素分为正负元素,然后在正确的一半中使用std::nth_element