形式陈述
符号 Cholesky 分解 公理库 稀疏 Cholesky 的消元图与符号分解 Symbolic Cholesky factorization 从逐点邻居补团预测 Cholesky 因子位置,证明路径判据,比较两种完整消元次序,并区分结构非零和数值相消。 给出每列的完整位置。若把每条数值更新都画成依赖边,图可能很密。能否用每列至多一条父边,保留必须先后处理的信息?
固定排列,设 L 为下三角因子的结构模式。定义
是 结 构 非 零 parent ( j ) = min { i > j : L i j 是结构非零 } . 若集合为空,则 j 没有父节点,是一个根。把每个非根连向其父节点,得到消元树 ;矩阵模式不连通时,应称为消元森林。父编号严格增加,所以不可能有有向环;每个节点至多一个父节点,确实具有根树与祖先关系 公理库 有根树与祖先关系 Rooted tree · Ancestor relation in a rooted tree · Parent and depth in a tree 在树中选定根后,由唯一根路径定义父子、祖先、深度与子树。 。
构造接口很简单:输入每列有序行号,跳过对角,取第一个行号作父节点;空的下方部分记为根。如果列号尚未排序,可扫描求最小值。后一实现总时间 O ( nnz struct L ) ,父数组占 O ( n ) 。这个成本假设因子模式已给定,不包括获得它所需的符号分析。
最重要的性质是:只要 i > j 且 L i j 结构非零,i 就是 j 的祖先。反方向一般不成立;一棵消元树并不能单独编码所有因子位置。
直觉
一列消完后,它的剩余邻居已被补成团。其中编号最小的邻居先被处理,可以接收这一列的贡献,再把需要继续传递的信息送向更晚的邻居。父边正是这个最早接收者。
图片加载失败 父指针压缩消元依赖 为什么每个因子非零都通向祖先
设 L i j 为结构非零,令 p = parent ( j ) 。若 p = i ,结论成立;否则 j < p < i 。消去 j 时,p 与 i 同为剩余邻居,所以二者被连接。到消去 p 时,位置 L i p 仍在结构模式内。
于是问题从 ( j , i ) 转成 ( p , i ) 。继续取父节点,编号严格增加且不超过 i ,有限步后必到 i 。这也说明完整更新依赖 j → i 可以沿父路径传递,父数组没有漏掉必要的先后约束。
证明使用结构边,不依赖某次计算中的系数恰好非零。若数值相消使一条实际更新为零,预先保留的树仍是安全的调度依据。
例子与边界
取七个顶点,原边为
01 , 12 , 26 , 34 , 45 , 56 , 即两条链 0 − 1 − 2 − 6 与 3 − 4 − 5 − 6 在顶点 6 汇合。可以用 A = I + L G 实现一个具有此图的正定矩阵,其中 L G 是图 Laplacian;单位阵使常量方向也有正能量。
按 0 , 1 , 2 , 3 , 4 , 5 , 6 消元,每次当前节点只有一个尚存邻居,所以没有填充。模式与父指针如下:
列 j
严格下方行号
父节点
0
1
1
1
2
2
2
6
6
3
4
4
4
5
5
5
6
6
6
空
根
第 0 列必须先于第 1 列,第 1 列先于第 2 列;另一侧相应是 3 → 4 → 5 。两侧可以同时推进,根 6 等待两条子链的贡献都到达。
但 2 是 0 的祖先,L 20 却不在模式中;6 也是 0 的祖先,L 60 同样不在模式中。父路径记录间接依赖,不会自动把所有祖先变成直接因子位置。
树高、列大小与并行成本
本例的两个子树没有相互依赖,可独立计算局部更新。不过它们都向根贡献数值,汇合时仍需归约或同步。“子树独立”不表示多个线程可以不加控制地同时写同一块数组。
若把同一无分支链按自然次序消元,消元树也会是一条长链,串行依赖深。重排序可能让树更平衡,但树高不是唯一指标:一个很宽的树若在根部汇集极大稠密前沿,最终的算术量和内存仍可能主导时间。要同时看每个节点对应的列大小、工作权重和可用并行度。
如果图不连通,各连通分量独立产生一棵树。人为添加一个没有数值自由度的超级根可以方便遍历,但不应把它当成额外矩阵列或给它增加因子非零。
推论与应用
先由父指针建立每个节点的孩子列表,再从各根沿孩子方向做深度优先遍历 公理库 深度优先搜索 Depth-first search · DFS 沿未访问边尽可能深入后回溯的图遍历算法。 ,按退出顺序获得后序:孩子先于父亲,所有依赖方向都一致。后序可帮助安排工作与聚集子树数据;它本身不重新求最小填充排列,也不把任何正序编号都变成相同的数值算法。
树还可以配合原矩阵模式做结构可达性查询,避免显式遍历所有已填充图边。此时必须保留原边信息:仅凭“祖先”判据无法恢复因子模式,正如上例所示。
嵌套剖分 公理库 嵌套剖分消元顺序 Nested dissection ordering 递归把二维网格分隔器排在子域之后,用完整填充账本与逐层前沿计数推导存储和算术界,并说明三维为何更昂贵。 先消去分离子域、最后处理分隔器,往往产生适于子树并行的依赖结构。它的分隔器树以一整组顶点为节点,消元树则以单列为节点;两者可以相互解释,但不是同一个数据对象。
参考资料
Yousef Saad, CSCI 8314, “Sparse Direct Methods”, slides 8-6–8-18:官方讲义 。父指针、列依赖、祖先性质、自然序与嵌套剖分的对比。
Manpreet S. Khaira, Gary L. Miller and Thomas J. Sheffler, Nested Dissection , CMU-CS-92-106R, 1992, §3.3:机构报告 。分隔器树及其与消元路径的联系。