0%

矩阵的压缩存储

矩阵在数据表示中举足轻重。为了方便提取矩阵元素通常都是用二维数组进行存储。但是矩阵并不总是满元素矩阵,里面很多的空元素浪费了很多存储空间,因此有几种特殊矩阵的压缩存储方式。

对称矩阵

对一个 n 阶方阵,其元素 a_ij=a_ji, 则称其为对称矩阵。

容易知道,对称矩阵其实只要记录半边的元素即可,使用二维数组会浪费大量空间。

因此我们使用一个 A[n(n+1)/2] 的一维数组存储按行矩阵下三角部分。即 A[0] 存储 a_11,A[1] 存储 a_21,A[2] 存储 a_22,A[3] 存储 a_31 ... 依次按行存储。

因此下三角元素 a_ij,在 A 中的下标即 k=1+2+ ... + (i-1) + j -1=i*(i-1)/2+j-1。

而上三角元素即反转行列序号进行下标计算即可。

注意按行还是按列存储对存储下标计算有影响。

三角矩阵

上/下三角矩阵一样,以下三角矩阵为例。下三角矩阵是下三角有任意元素,但上三角区元素均为同一常量。因此和对称矩阵的存储方式类似,只是在存储完下三角区后,追加一个元素表示上半区的所有元素。

一维数组 A[n(n+1)/2+1]。下三角区元素 a_ij 下标 k=i(i-1)/2+j-1,上三角元素下标 k=n(n+1)/2

三对角矩阵

三对角矩阵也叫做带状矩阵,矩阵内元素 a_ij, 当|i-j|>1 时,a_ij=0。即所有元素集中在主对角线中心的三条对角线上,其余元素为 0。

易知存储上首行和末行只有两个元素,其余每行有三个元素。因此也可以使用 A[3*(n-2)+4] 的一维数组进行存储。

A 中元素 a_ij 的存储下标 k=2i+j-3。

稀疏矩阵

矩阵非零元素比零元素少得多得多,即为稀疏矩阵。例如 521X521 的矩阵中,只有 802 个非零元素。

因此我们肯定选择只存储非零元素即可,但是非零元素不像上面几个一样有分布规律,因此这里还需要记录非零元素的位置信息。

所以采用三元组方式存储,每个存储结构保存位置 i,j,以及值 v。至于实现可以采用结构体数组或是十字链表法。

矩阵压缩的题目大多都是计算下标,注意按行按列的存储方式,注意矩阵起始下标是 1 还是 0,注意存储数组的起始下标是 1 还是 0。