Собственный разреженный вектор: найти максимальный коэффициент - PullRequest
0 голосов
/ 16 октября 2018

Я работаю с разреженным вектором с помощью Eigen, и мне нужно найти эффективный способ вычисления индекса максимального коэффициента (или n-го максимального коэффициента).

Мой первоначальный метод использует Eigen :: SparseVector :: InnerIterator, однако он не вычисляет правильное значение в случае вектора, содержащего только нули и отрицательное значение, поскольку InnerIterator выполняет итерацию только с ненулевыми значениями.

Как реализовать это, чтобы учесть нулевые значения?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Чтобы получить индекс наибольшего ненулевого элемента, вы можете использовать эту функцию:

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 <=0v.nonZeros()<v.size()) вы можете выполнять итерацию по innerIndexPtr() доВы находите разрыв между последовательными элементами (или пишете что-то более сложное, используя std::lower_bound)

Для получения n-го по величине элемента это зависит от того, насколько велика ваша n относительно размера вектора, сколько неЕсли у вас есть нули, если вы можете изменить SparseVector и т. д.

Особенно, если n относительно велик, рассмотрите возможность разбиения ваших элементов на положительные и отрицательные элементы, а затем используйтеstd::nth_element в правильной половине.

0 голосов
/ 16 октября 2018

Выполните итерацию по массиву индексов (я думаю, innerIndices) одновременно с внутренним итератором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...