找到稀疏矩阵(Eigen)最大值的有效方法

Abo*_*azl 3 c++ eigen

我想知道是否有可能以有效的方式在稀疏矩阵中找到最大/最小系数。

似乎没有为稀疏矩阵实现 minCoeff()/maxCoeff() 函数,这有点奇怪。

我在这里找到了这个答案,但我无法弄清楚。

 using Tmp = typename remove_cv_ref<decltype(matrix)>::type;
 if constexpr(std::is_base_of<Eigen::SparseMatrixBase<Tmp>, Tmp>::value)
 max = Eigen::Map<const Vector>(matrix.valuePtr(), matrix.size()).maxCoeff();
 else
    max = matrix.maxCoeff();
Run Code Online (Sandbox Code Playgroud)

编辑: 这是我的尝试,我不确定效率。

typedef Eigen::SparseMatrix<int, Eigen::RowMajor> SRI;
int maxCoeff(const SparseMatrix<int, RowMajor> &A)
{
    size_t row = A.rows();
    size_t col = A.cols();
    int max_value = -10000000;
    for (size_t k = 0; k < row; k++)
    {
        for (SRI::InnerIterator it(A, k); it; ++it)
        {
            if (it.value() > max_value)
                max_value = it.value();
        }
    }
    return max_value;
}
Run Code Online (Sandbox Code Playgroud)

gga*_*ael 6

这些函数不容易获得,因为是否应该考虑隐式零点可能不明确。例如,如果所有非零值都是负数,应maxCoeff返回0?

如果您只想考虑显式存储的元素并且您的稀疏矩阵处于压缩模式,那么您可以编写:

auto max = matrix.coeffs().maxCoeff();
Run Code Online (Sandbox Code Playgroud)

系数_方法等同于RHertel的答案。