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

标签 c++ eigen

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

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

我找到了这个答案 here , 但我想不通。

 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();

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

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;
}

最佳答案

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

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

auto max = matrix.coeffs().maxCoeff();

coeff方法等同于 RHertel 的答案。

关于c++ - 找到稀疏矩阵( Eigen )最大值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57489702/

相关文章:

c++ - 何时使用 Eigen::Vector 与 std::vector?

c++ - 如何使用 Eigen 在函数中访问/写入矩阵?

c++ - DOMDocument C++ 内存管理

c++ - OpenMP 嵌套并行化

c++ - 使用 lambda 作为试运行选项正常吗?

c++ - C++ 中的 "error: Expected a type, got ' 类名 '"

c++ - 具有子矩阵类的特征引用

c++ - 为什么不能将反向迭代器转换为正向迭代器?

c++ - 使用 Eigen 创建具有俯仰、偏航、滚动的旋转矩阵

c++ - 对 RGB 图像使用特征数组