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

目录

1. 稠密矩阵求解

2. 稀疏矩阵求解

总结


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


1. 稠密矩阵求解

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

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

方法 LLT LDLT FullPivLU HouseholderQR JacobiSVD
时间 4.974s 110.55s 1826.19s 376.725 Nan

参数化方法结果:

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


2. 稀疏矩阵求解

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

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

方法

Simplicial

Cholesky

SparseLU

LeastSquares

ConjugateGradient

Conjugate

Gradient

BiCGSTAB
时间 0.827s 2.401s 7.157s 0.732s 1.308s

参数化结果比较:

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


总结

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

猜你喜欢

转载自blog.csdn.net/aliexken/article/details/126688128