Чтобы получить индекс наибольшего ненулевого элемента, вы можете использовать эту функцию:
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
в правильной половине.