“给定一个对称正定稀疏矩阵,能否在计算任何平方根之前,就知道它的 Cholesky 因子需要哪些存储位置?这就是符号分解的问题。”
形式陈述
稀疏矩阵是大量位置为零、适合按少数有效项组织计算的矩阵。“稀疏”没有脱离规模和任务的统一百分比阈值;关键是能否利用零模式,使存储与运算主要随有效项数量增长,而不是随全部
对
实现实际保存的条目数另记为 nnz 也可能按存储条目而非数学非零计数。
COO 用三元组 values 保存值,col_idx 保存相应列号,row_ptr 长度为
采用从零开始的下标时,行指针非降,起点为零,终点为 values 与 col_idx 都有
表示正确性的要求,是从这些数组恢复出的矩阵等于目标矩阵。索引排序、重复项合并以及显式零清除是不同操作;例如 SciPy 所称的 canonical CSR 要求行内列号有序且无重复项,并不自动要求删除所有显式零。
直觉
稠密表示为每个位置保留一个槽位,零也占位置;稀疏表示把“这个值在哪里”与“这个值是多少”一起保存。节省值槽位的同时,要付出索引和分组指针的成本。因此有效项少是机会,合适的组织方式才把机会变成实际收益。
CSR 可以理解为把每一行的有效项接成长队,再用一组边界标出每行从哪里开始。读取一行不必搜索全部条目,也不需要为它单独分配一个小对象;顺着两个行指针之间的连续区间就能完成扫描。
例子与边界
一份可以手算恢复的 CSR
取
它的一份 CSR 表示是
第零行读取位置
CSR 的矩阵—向量乘法对每个存储项执行一次乘加,并初始化每行输出,时间为
重复坐标与零项
组装时可能先后得到
有时保留零是有意的,例如提前固定数值迭代中的存储模式,避免每轮重新分配。此时应分别报告结构条目数与实际非零数,不能用其中一个冒充另一个。丢弃一个很小但非零的项则是数值近似,需要额外的误差标准,已不只是表示转换。
网格矩阵为何只有线性多项
在
个非零项。边界行少几个邻接项,因此不能无条件写成恰好
稀疏输入可以产生稠密中间结果
令
消元也会产生填充。对正定矩阵
消去第一个变量后,剩余 Schur 补为
原来两个未直接耦合的位置出现了非零交叉项。消元顺序改变这种新增连接的过程,这才是重排序影响空间和工作量的原因。
推论与应用
表示应服务主要操作。COO 适合累计组装,再排序合并;CSR 适合逐行遍历和乘向量;CSC 适合逐列操作及一些稀疏直接法。CSR 行内未排序时,查一个指定列号一般要扫描该行;有序时可以二分,但中间插入仍可能移动后续存储,不能同时享有固定数组的所有优势。
非零模式可以用图表达:对称方阵中的非零非对角项给出顶点连接,重排序对应重命名变量。这个视角用于解释填充与划分;矩阵定义本身则不要求先有图,长方矩阵也可以直接使用稀疏表示。
符号 Cholesky 分解把这一视角变成逐轮算法:消去一个顶点,将其剩余邻居补成团,并记录每列位置。消元树压缩列依赖,嵌套剖分则把分隔器排在子域之后,以控制规则网格中的填充和算术量。
迭代求解器常只需要
参考资料
- SciPy 官方文档,csr_matrix:行指针、存储非零计数、canonical 格式、重复项及显式零。
- Timothy A. Davis,Direct Methods for Sparse Linear Systems,2006,Chapters 2–4:压缩列存储、消元图与填充;进一步阅读。
- Yousef Saad,Iterative Methods for Sparse Linear Systems,2nd ed.,2003,Chapter 3:稀疏表示与基本计算;进一步阅读。