C++ 特征值 - 由于“maxCoeff()”错误而无法运行 SVD

C++ Eigen - Cannot run SVD due to "maxCoeff()" error

提问人:Cedric Martens 提问时间:11/14/2023 更新时间:11/14/2023 访问量:45

问:

我有以下代码


    Eigen::SparseMatrix<double> S = A*B.transpose();
    Eigen::JacobiSVD<Eigen::SparseMatrix<double>> svd(S);

使用 JacobiSVD 和 BDCSVD 计算 SVD 时存在错误

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

我不知道为什么我的矩阵失败了,为什么没有定义maxCoeff()?我太新了,Eigen也无法理解。

C++ 特征集 Eigen3

评论

0赞 Tim Roberts 11/14/2023
有没有做得更好?matrix.array().abs()
3赞 Homer512 11/14/2023
SVD 专为密集矩阵而非稀疏矩阵而设计。据我了解,对于稀疏矩阵,您使用迭代线性求解器
1赞 chtz 11/15/2023
@TimRoberts 这里的问题更多是仅适用于密集矩阵,但不直接显示这一点,而只是失败,因为它在矩阵上使用了方法,而这些方法不是为稀疏矩阵实现的。(对于稀疏矩阵来说,实际上不会太难实现)。JacobiSVDmaxCoeff
1赞 Homer512 11/15/2023
我真的没有代码可以显示。一行不是正确的答案。SVD 没有 1 对 1 的替代品。如果您只需要求解一个系统,并且其中一个求解器适合您的矩阵风格,请随时扩展您的问题以涵盖您的用例,并使用可行的代码发布答案。但我对 Eigen 的稀疏模块的经验太有限了,不能简单地写“改为这样做”。我只会复制并粘贴文档
1赞 chtz 11/15/2023
我同意荷马的观点,解决方案取决于您的实际需求。如果需要奇异值,可能需要先将矩阵转换为密集矩阵。或者检查是否有其他库可以直接从稀疏矩阵中计算(或近似)奇异值。

答: 暂无答案