Skip to content

模型Model

稀疏矩阵表示与运算

施工中 · 内容逐步修订

Sparse matrix

只存非零项及其位置,以稀疏模式组织矩阵运算、图结构、重排序与填充成本。

形式陈述 ​

稀疏矩阵是大量位置为零、适合按少数有效项组织计算的矩阵。“稀疏”没有脱离规模和任务的统一百分比阈值;关键是能否利用零模式,使存储与运算主要随有效项数量增长,而不是随全部 mn 个位置增长。

对 A∈Rm×n,数学上的非零数为

nnz(A)=#{(i,j):Aij≠0}.

实现实际保存的条目数另记为 s。若有显式存储的零或重复坐标,s 可以大于 nnz(A);库接口中的 nnz 也可能按存储条目而非数学非零计数。

COO 用三元组 (i,j,aij) 保存坐标和值,适合逐项组装。CSR 按行压缩,使用三个数组:values 保存值,col_idx 保存相应列号,row_ptr 长度为 m+1,第 i 行的条目占据半开区间

[row_ptr[i],row_ptr[i+1]).

采用从零开始的下标时,行指针非降,起点为零,终点为 s;values 与 col_idx 都有 s 项,所有列号落在 0,…,n−1。这些约束防止读越界或把值放到矩阵外。形状也是表示的一部分:尾部若全是零列,单凭最大列号无法恢复列数。空行对应相邻指针相等。CSC 对称地按列压缩,列指针定位一列,另存行号。

表示正确性的要求,是从这些数组恢复出的矩阵等于目标矩阵。索引排序、重复项合并以及显式零清除是不同操作;例如 SciPy 所称的 canonical CSR 要求行内列号有序且无重复项,并不自动要求删除所有显式零。

直觉

稠密表示为每个位置保留一个槽位,零也占位置;稀疏表示把“这个值在哪里”与“这个值是多少”一起保存。节省值槽位的同时,要付出索引和分组指针的成本。因此有效项少是机会,合适的组织方式才把机会变成实际收益。

CSR 可以理解为把每一行的有效项接成长队,再用一组边界标出每行从哪里开始。读取一行不必搜索全部条目,也不需要为它单独分配一个小对象;顺着两个行指针之间的连续区间就能完成扫描。

例子与边界

一份可以手算恢复的 CSR ​

取

A=(200500000−104).

它的一份 CSR 表示是

values=[2,5,−1,4],col_idx=[0,3,1,3],row_ptr=[0,2,2,4].

第零行读取位置 0,1 的两项;第一行的区间是 [2,2),所以为空;第二行读取位置 2,3。给定 x=(1,2,3,4)⊤,逐行计算可得

Ax=(2⋅1+5⋅4, 0, −1⋅2+4⋅4)⊤=(22,0,14)⊤.

CSR 的矩阵—向量乘法对每个存储项执行一次乘加,并初始化每行输出,时间为 O(m+s)。矩阵本身占 O(m+s) 存储;输入向量长度为 n、输出向量长度为 m,须按任务另计。把复杂度只写成 O(s),会漏掉大量空行及输出初始化。

重复坐标与零项 ​

组装时可能先后得到 (0,1,3) 与 (0,1,−3)。若接口约定重复坐标相加,两项合并后数值为零;这与“只保留最后一次写入”的规则不同。合并后还可以暂时保留该零槽位,再通过显式清理删除它。

有时保留零是有意的,例如提前固定数值迭代中的存储模式,避免每轮重新分配。此时应分别报告结构条目数与实际非零数,不能用其中一个冒充另一个。丢弃一个很小但非零的项则是数值近似,需要额外的误差标准,已不只是表示转换。

网格矩阵为何只有线性多项 ​

在 q×q 内部网格上离散二维五点模板,令未知量总数 N=q2,q≥1。若各中心对角项及内部水平、竖直邻接项非零,矩阵共有

N+4q(q−1)=5q2−4q

个非零项。边界行少几个邻接项,因此不能无条件写成恰好 5N;但数量仍为 Θ(N),远小于稠密矩阵的 N2。固定边界值的贡献放到右端向量,不需要凭空增加内部未知量之间的连接。

稀疏输入可以产生稠密中间结果 ​

令 u,v∈Rn 全为一,e1 是第一个标准基向量。方阵 A=ue1⊤ 仅第一列非零,B=e1v⊤ 仅第一行非零,各有 n 个非零项;乘积 AB=uv⊤ 却在全部 n2 个位置非零。乘法输出规模因此不能只从输入条目数推断。

消元也会产生填充。对正定矩阵

M=(3−1−1−120−102),

消去第一个变量后,剩余 Schur 补为

(2002)−13(1111)=(5/3−1/3−1/35/3).

原来两个未直接耦合的位置出现了非零交叉项。消元顺序改变这种新增连接的过程,这才是重排序影响空间和工作量的原因。

推论与应用

表示应服务主要操作。COO 适合累计组装,再排序合并;CSR 适合逐行遍历和乘向量;CSC 适合逐列操作及一些稀疏直接法。CSR 行内未排序时,查一个指定列号一般要扫描该行;有序时可以二分,但中间插入仍可能移动后续存储,不能同时享有固定数组的所有优势。

非零模式可以用图表达:对称方阵中的非零非对角项给出顶点连接,重排序对应重命名变量。这个视角用于解释填充与划分;矩阵定义本身则不要求先有图,长方矩阵也可以直接使用稀疏表示。

符号 Cholesky 分解把这一视角变成逐轮算法:消去一个顶点,将其剩余邻居补成团,并记录每列位置。消元树压缩列依赖,嵌套剖分则把分隔器排在子域之后,以控制规则网格中的填充和算术量。

迭代求解器常只需要 x↦Ax。若模板或算子结构能直接产生这一结果,还可使用不显式存矩阵的实现。比较它与 CSR 时,应同时计算生成系数、索引访问和重复迭代的成本,而不只比较文件里存了多少个数。

参考资料
  • 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:稀疏表示与基本计算;进一步阅读。
关系图谱18 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系