我想知道是否有可能以有效的方式在稀疏矩阵中找到最大/最小系数。
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/