目录
在上一篇博客中,我们介绍了三维人脸参数化方法,链接:三维人脸参数化方法。在该算法中,涉及到求解线性方程AX=b的问题。这里的A为针对网格的拉普拉斯权重矩阵,规模是比较大的,尺度为N*N,N为网格点数。对于人脸数据,动则10000以上的点数,为线性方程求解带来挑战。Eigen提供了一系列的求解线性方程的解法,本博客就基于人脸参数化方法,对比下这些解法的性能特点,以帮助需要深入了解求解大规模线性方程的同学,选择合适的计算工具。
在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对于大规模矩阵求解,时间开销过大,且在计算过程中崩溃。
可以看到,使用稠密矩阵求解,整体计算效率较低,且精度没有保障。究其原因,在参数化问题中,矩阵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分解等。从对算法精度与效率的要求,各个求解器的表现差异不容忽视。因此,对于不同的线性求解问题,要选择与之匹配的求解方法。