我正在使用Eigen处理稀疏向量,因此我需要找到一种有效的方法来计算最大系数(或第n个最大系数)的索引。
我的初始方法使用Eigen :: SparseVector :: InnerIterator,但是在矢量仅包含零和负值的情况下,它不会计算正确的值,因为InnerIterator仅迭代非零值。
如何实现它以便考虑零值?
答案 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
。