我正在尝试使用 Eigen 库解决C ++中的平滑样条问题。
我设置要解决的线性问题,现在我只需要实现 求解器的代码。所以我的问题是标准的线性系统:
Ax = b
其中A是密集矩阵。
首先,我想说清楚我对 Eigen 库是全新的。我真的希望不要问一个愚蠢的问题。
我的想法是使用迭代方法来解决这个问题。在Eigen文档中,我发现了一个可能的算法 LeastSquareConjugateGradient ,它似乎适用于稀疏矩阵和密集矩阵。
我尝试编译一个示例,并且使用 SparseMatrix 类为矩阵A工作正常,但它未能尝试使用 MatrixXd 类。特别是当我使用 .compute()方法时会出现一些问题:
LeastSquaresConjugateGradient<MatrixXd> lscg2;
lscg2.compute(A);
编译器错误对我来说非常难以理解:
In file included from /u/sw/pkgs/toolchains/gcc-glibc/5/pkgs/eigen/3.3.3/include/eigen3/Eigen/IterativeLinearSolvers:39:0,
from /u/sw/pkgs/toolchains/gcc-glibc/5/pkgs/eigen/3.3.3/include/eigen3/Eigen/Sparse:33,
from prova.cpp:3:
/u/sw/pkgs/toolchains/gcc-glibc/5/pkgs/eigen/3.3.3/include/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h: In instantiation of 'Eigen::LeastSquareDiagonalPreconditioner<_Scalar>& Eigen::LeastSquareDiagonalPreconditioner<_Scalar>::factorize(const MatType&) [with MatType = Eigen::Ref<const Eigen::Matrix<double, -1, -1>, 0, Eigen::OuterStride<> >; _Scalar = double]':
/u/sw/pkgs/toolchains/gcc-glibc/5/pkgs/eigen/3.3.3/include/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h:170:23: required from 'Eigen::LeastSquareDiagonalPreconditioner<_Scalar>& Eigen::LeastSquareDiagonalPreconditioner<_Scalar>::compute(const MatType&) [with MatType = Eigen::Ref<const Eigen::Matrix<double, -1, -1>, 0, Eigen::OuterStride<> >; _Scalar = double]'
/u/sw/pkgs/toolchains/gcc-glibc/5/pkgs/eigen/3.3.3/include/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h:241:5: required from 'Derived& Eigen::IterativeSolverBase<Derived>::compute(const Eigen::EigenBase<OtherDerived>&) [with MatrixDerived = Eigen::Matrix<double, -1, -1>; Derived = Eigen::LeastSquaresConjugateGradient<Eigen::Matrix<double, -1, -1> >]'
prova.cpp:26:18: required from here
/u/sw/pkgs/toolchains/gcc-glibc/5/pkgs/eigen/3.3.3/include/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h:157:57: error: 'const class Eigen::Ref<const Eigen::Matrix<double, -1, -1>, 0, Eigen::OuterStride<> >' has no member named 'innerVector'
RealScalar sum = mat.innerVector(j).squaredNorm();
所以我的天真解决方案是通过 sparseView()将 MatrixXd 转换为 SparseMatrix 。但我真的认为这不是计算效率。
最后我的问题是:
提前谢谢!