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

Eigen Sparse Vector : Find max coefficient

本文关键字:向量 特征      更新时间:2023-10-16

我正在使用特征向量,我需要找到一种有效的方法来计算最大系数(或第 n 个最大系数(的索引。

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

如何实现它以考虑零值?

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

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编写更复杂的内容(

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

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

在内部迭代器的同时迭代索引数组(我认为innerIndices(。