<读书笔记8>稀疏矩阵Cholesky分解[3]
本篇为稀疏矩阵求解算法经典论著<Direct Methods for Sparse Linear System>的<读书笔记 8>
4.6 Symbolic analysis
矩阵的符号分析是其数值分解的前导。它通常只包括计算非零模式而不进行数值计算。这使得数值分解可以对具有相同非零模式的矩阵序列进行重复计算(在求解非线性方程时经常出现的一种情况)。符号因子分解包括对因子分解的非零模式的显式表示的计算;一些稀疏的Cholesky算法需要这一点。矩阵的置换对fill-in有很大的影响。通常找到一个fill-reducing置换矩阵 P ,使得 PAP^T 的因子分解要比 A 更加稀疏。cs_schol函数完成了应用于up-looking 稀疏Cholesky分解的符号分析。
4.7 Up-looking Cholesky
函数cs_cho1是up-looking Cholesky算法的实现。在本书中,用粗体描述代码中相对应的注释,如下:
Nonzero pattern of L(k, :):
Triangular solve:
Compute L(k,k):
执行完整的稀疏Cholesky分解,包括用函数S=cs_schol(order,A)完成fill-reducing preordering和符号分析,接下来用N=cs_chol(A,S),其中order为0,则用自然排序,如果order为1,则用对 A+A^T 完成fill-reducing 最小度排序。
4.8 left-looking and supernodal Cholesky
left-looking的Cholesky分解算法比向上的Cholesky分解算法更常用。其伪代码为:
它一次计算一列,可以从以下表达式推导得到:
\begin{bmatrix}L_{11} & &\\ l_{12}^{T} & l_{22} \\ L_{31} & l_{32} & L_{33} \end{bmatrix} \begin{bmatrix}L_{11}^{T} & l_{21}&L_{31}\\ & l_{22} &l_{32}^T \\ & & L_{33}^T \end{bmatrix}= \begin{bmatrix}A_{11} & a_{21}&A_{31}^T\\ a_{12}^{T} & a_{22} &a_{32}^T \\ A_{31} & a_{32} & A_{33} \end{bmatrix}
其中,每个矩阵的中间的行和列均为矩阵第 k 行和第 k 列。如果 L 的前 k-1 列已经算出来,则 l_{22}=\sqrt{a_{22}-l_{12}^Tl_{12}} ,然后就能得到 l_{32}=(a_{32}-L_{31}l_{12})/l_{22} 。对于稀疏矩阵的伪代码为:
该方法要求计算 L 的列的非零样式(按顺序)在数值分解之前。相比之下,up-looking方法在进行数值因数分解之前只需要列计数的累积和,并在一次遍历中计算非零样式(按排序顺序)和数值分解。使用cs_ereach可以在 O(|L|) 时间内计算 L 的非零样式。
left-looking的数值分解需要访问 L 的第 k 行。非零样式 L(k,:) 通过第 k 行子树 \mathcal T^k 。这对于up-looking算法已经足够,但是对于left-looking方法仍然还需要访问 L(k,:) 以及submatrix L(k:n,1:k-1) 的数值。
left-looking算法构成了超节点法(supernodal)的基础。在Cholesky分解以及LU分解中,经常会出现以下形式的矩阵,黑色的稠密块(block)即