【问题标题】:Eigen Sparse Vector : Find max coefficient特征稀疏向量:找到最大系数
【发布时间】:2018-10-16 04:49:29
【问题描述】:

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

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

如何实现它以考虑零值?

【问题讨论】:

  • 所以如果你所有的条目都是负数,你想要第一个空元素的索引吗?
  • 顺便说一句,非零的平均数量与向量大小的关系是多少?如果该比率高于 20%,那么我建议切换到具有显式零的密集存储。您将获得更高的性能和更简单的性能。
  • 是的,ggael,就是这样。但我不知道最有效的方法是什么。

标签: c++ max sparse-matrix eigen


【解决方案1】:

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

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 &lt;=0(和v.nonZeros()&lt;v.size()),您可以遍历innerIndexPtr(),直到找到连续元素之间的间隙(或者使用std::lower_bound 编写更复杂的内容)

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

特别是如果n比较大,考虑把partition你的元素分成正负元素,然后在正确的一半使用std::nth_element

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2019-01-27
      • 2017-10-21
      • 2023-01-16
      • 2015-07-28
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多