密集矩阵的特征库迭代方法

时间:2017-11-19 16:24:04

标签: c++ matrix linear-algebra eigen eigen3

我正在尝试使用 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 。但我真的认为这不是计算效率。

最后我的问题是:

  • 通过密集矩阵转换为稀疏矩阵有多糟糕 sparseView()使用 LeastSquareConjugateGradient 吗?
  • (或更好)如何将 LeastSquareConjugateGradient MatrixXd 矩阵类型一起使用?
  • 或者还有其他迭代方法可以在 Eigen 中实现 MatrixXd 吗?

提前谢谢!

0 个答案:

没有答案