• 基于Eigen求解线性方程组Ax=b的性能分析


    目录

    1. 稠密矩阵求解

    2. 稀疏矩阵求解

    总结


    在上一篇博客中,我们介绍了三维人脸参数化方法,链接:三维人脸参数化方法。在该算法中,涉及到求解线性方程AX=b的问题。这里的A为针对网格的拉普拉斯权重矩阵,规模是比较大的,尺度为N*N,N为网格点数。对于人脸数据,动则10000以上的点数,为线性方程求解带来挑战。Eigen提供了一系列的求解线性方程的解法,本博客就基于人脸参数化方法,对比下这些解法的性能特点,以帮助需要深入了解求解大规模线性方程的同学,选择合适的计算工具。


    1. 稠密矩阵求解

    在Eigen中,对于稠密矩阵求解,包含在Eigen/Dense,有如下工具:

    可以看到,上述线性系统求解包括LU分解,SVD分解,QR分解等。在参数化任务中,上述方法的实际表现如下(测试用人脸子曲面顶点数为3837):

    方法LLTLDLTFullPivLUHouseholderQRJacobiSVD
    时间4.974s110.55s1826.19s376.725Nan

    参数化方法结果:

    可以看到LLT和LDLT的计算结果存在严重的误差,使得参数化后点的位置出现了极大的偏移。FullPivLU和HouseholderQR两个方法输出了正确的结果,但是时间开销过大。JacobiSVD对于大规模矩阵求解,时间开销过大,且在计算过程中崩溃。


    2. 稀疏矩阵求解

    可以看到,使用稠密矩阵求解,整体计算效率较低,且精度没有保障。究其原因,在参数化问题中,矩阵A不是稠密的,而是包含大量0元素的稀疏矩阵。因此,使用稀疏矩阵求解工具,比较适合解决曲面参数化中,邻接矩阵的线性求解问题。对于稀疏矩阵求解,包含在Eigen/Sparse,有如下工具:

    对于上述方法,对应的计算时间为:

    方法

    Simplicial

    Cholesky

    SparseLU

    LeastSquares

    ConjugateGradient

    Conjugate

    Gradient

    BiCGSTAB
    时间0.827s2.401s7.157s0.732s1.308s

    参数化结果比较:

    可以看到,基于稀疏矩阵设计的求解器,在速度上远远优于前者,同时保持计算精度。


    总结

    针对线性求解问题矩阵数据分布的特性,选择合适的求解器至关重要。求解器从大类来说,可分为稠密矩阵求解和稀疏矩阵求解;从小类来说,包括LU分解,QR分解,SVD分解等。从对算法精度与效率的要求,各个求解器的表现差异不容忽视。因此,对于不同的线性求解问题,要选择与之匹配的求解方法。

  • 相关阅读:
    解决kkFileView4.4.0版本pdf、word不能预览问题
    Go:Signal信号量的简介与实践(优雅的退出)
    list的用法
    TinyOs操作系统---第0章 课程概述
    序列模型相关
    Webpack监视文件修改,自动重新打包文件
    16、Pytorch Lightning入门
    【Git】IDEA中Git常用的终端操作
    图扑软件 3D 组态编辑器,低代码零代码构建数字孪生工厂
    Python学习第六篇:lambda 表达式
  • 原文地址:https://blog.csdn.net/aliexken/article/details/126688128