Eigen对稀疏矩阵执行SVD报错:maxCoeff()未定义
Eigen稀疏矩阵SVD计算报错:
maxCoeff()未定义 问题代码
Eigen::SparseMatrix<double> S = A*B.transpose(); Eigen::JacobiSVD<Eigen::SparseMatrix<double>> svd(S);
报错信息
/eigen-src/Eigen/src/SVD/JacobiSVD.h: In instantiation of ‘Eigen::JacobiSVD<MatrixType, QRPreconditioner>& Eigen::JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType&, unsigned int) [with _MatrixType = Eigen::SparseMatrix<double>; int QRPreconditioner = 2; MatrixType = Eigen::SparseMatrix<double>]’: /eigen-src/Eigen/src/SVD/JacobiSVD.h:548:14: required from ‘Eigen::JacobiSVD<MatrixType, QRPreconditioner>::JacobiSVD(const MatrixType&, unsigned int) [with _MatrixType = Eigen::SparseMatrix<double>; int QRPreconditioner = 2; MatrixType = Eigen::SparseMatrix<double>]’ /eigen-src/Eigen/src/SVD/JacobiSVD.h:676:40: error: ‘const Eigen::SparseMatrixBase<Eigen::SparseMatrix<double> >::CwiseAbsReturnType’ {aka ‘const class Eigen::CwiseUnaryOp<Eigen::internal::scalar_abs_op<double>, const Eigen::SparseMatrix<double> >’} has no member named ‘maxCoeff’ 676 | RealScalar scale = matrix.cwiseAbs().maxCoeff();**
原因分析
Eigen的JacobiSVD和BDCSVD仅支持稠密矩阵(如MatrixXd),它们的内部实现依赖稠密矩阵特有的成员函数(比如maxCoeff())。而稀疏矩阵的CwiseAbs返回类型没有实现maxCoeff()方法,直接传入稀疏矩阵就会触发编译错误。
解决方法
方法1:转换为稠密矩阵计算
如果矩阵规模不大,直接转成稠密矩阵即可兼容现有SVD类:
Eigen::SparseMatrix<double> S = A*B.transpose(); Eigen::MatrixXd S_dense(S); // 稀疏转稠密 Eigen::JacobiSVD<Eigen::MatrixXd> svd(S_dense); // 或使用BDCSVD Eigen::BDCSVD<Eigen::MatrixXd> svd_bdc(S_dense);
方法2:使用稀疏矩阵专用SVD实现
若矩阵规模较大,转稠密会占用过多内存,改用Eigen的SparseSVD类(需确保启用Eigen的Sparse模块):
Eigen::SparseSVD<Eigen::SparseMatrix<double>> svd_sparse(S); // 可根据需求调整迭代参数,比如设置最大迭代次数或精度阈值 svd_sparse.setMaxIterations(100); svd_sparse.compute(S);
SparseSVD是迭代式求解器,适用于大规模稀疏矩阵,精度和计算速度可通过参数调整。
内容的提问来源于stack exchange,提问作者Cedric Martens
相关产品推荐
相关产品推荐

