• 基于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分解等。从对算法精度与效率的要求,各个求解器的表现差异不容忽视。因此,对于不同的线性求解问题,要选择与之匹配的求解方法。

  • 相关阅读:
    芸鹰蓬飞:抖店服务分怎么快速升分?
    如何实现自有App上的小程序第三方微信授权登陆?
    C++ Reference: Standard C++ Library reference: Containers: deque: deque: clear
    Godot C#连接信号不能像GDScirpt一样自动添加代码
    剑指offer 70. 圆圈中最后剩下的数字
    虚拟dom及diff算法之 —— snabbdom
    【Dotnet 工具箱】跨平台图表库 LiveCharts2
    JS+canvas+pdfjs实现图片或pdf高亮
    批量将xml文件转txt文件
    python asyncio websockets server
  • 原文地址:https://blog.csdn.net/aliexken/article/details/126688128