编程基础 - 特殊矩阵的压缩存储 (Compressed Storage of Special Matrix)

本文介绍了如何用C++实现特殊矩阵(如上三角、下三角、对称、三对角矩阵)和稀疏矩阵的压缩存储及还原。通过计算存储位置、设计数据结构,实现了矩阵的压缩与解压,特别地,对于稀疏矩阵,存储了非零元素的行号、列号和值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程基础 - 特殊矩阵的压缩存储 (Compressed Storage of Special Matrix)

返回分类:全部文章 >> 基础知识

本文将用C++实现特殊方阵和稀疏矩阵的压缩存储。

在查看本文之前,需要一些程序语言的基础,还要对“矩阵”与“二维数组”有一定了解。



1 特殊矩阵 (Special Matrix)

特殊矩阵:非零元素或零元素的分布有一定规律的矩阵。

压缩存储:在特殊矩阵中为了节省空间,有一些元素不必存储。

在程序中,最常见的特殊矩阵:

  • 上三角矩阵:方阵中只在上三角有元素;

  • 下三角矩阵:方阵中只在下三角有元素;

  • 对称矩阵:方阵中的上三角与下三角关于对角线对称;

  • 三对角矩阵:方阵中只有主对角线及其上下临近平行线有元素;

  • 稀疏矩阵:非零元素的数量远远小于矩阵元素数量。

    • 稀疏因子e:非零元素与长宽乘积的比值(有人认为e小于0.05才能称为稀疏矩阵)

10x10特殊矩阵格式如下:

上三角矩阵:
  1   2   3   4   5   6   7   8   9  10
  0  11  12  13  14  15  16  17  18  19
  0   0  20  21  22  23  24  25  26  27
  0   0   0  28  29  30  31  32  33  34
  0   0   0   0  35  36  37  38  39  40
  0   0   0   0   0  41  42  43  44  45
  0   0   0   0   0   0  46  47  48  49
  0   0   0   0   0   0   0  50  51  52
  0   0   0   0   0   0   0   0  53  54
  0   0   0   0   0   0   0   0   0  55

下三角矩阵:
  1   0   0   0   0   0   0   0   0   0
  2   3   0   0   0   0   0   0   0   0
  4   5   6   0   0   0   0   0   0   0
  7   8   9  10   0   0   0   0   0   0
 11  12  13  14  15   0   0   0   0   0
 16  17  18  19  20  21   0   0   0   0
 22  23  24  25  26  27  28   0   0   0
 29  30  31  32  33  34  35  36   0   0
 37  38  39  40  41  42  43  44  45   0
 46  47  48  49  50  51  52  53  54  55

对称矩阵:
  1   2   4   7  11  16  22  29  37  46
  2   3   5   8  12  17  23  30  38  47
  4   5   6   9  13  18  24  31  39  48
  7   8   9  10  14  19  25  32  40  49
 11  12  13  14  15  20  26  33  41  50
 16  17  18  19  20  21  27  34  42  51
 22  23  24  25  26  27  28  35  43  52
 29  30  31  32  33  34  35  36  44  53
 37  38  39  40  41  42  43  44  45  54
 46  47  48  49  50  51  52  53  54  55

三对角矩阵:
  1   2   0   0   0   0   0   0   0   0
  3   4   5   0   0   0   0   0   0   0
  0   6   7   8   0   0   0   0   0   0
  0   0   9  10  11   0   0   0   0   0
  0   0   0  12  13  14   0   0   0   0
  0   0   0   0  15  16  17   0   0   0
  0   0   0   0   0  18  19  20   0   0
  0   0   0   0   0   0  21  22  23   0
  0   0   0   0   0   0   0  24  25  26
  0   0   0   0   0   0   0   0  27  28

稀疏矩阵:
  0   0   0   0   0   0   0   0   0   0
 17   0   0   0   3   0   0   0   0   0
  0   0  69   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0  61   0
  0   0   0  42   0  98   0   0   0   0
  0   0   0   0   0   0   0   0   0  88
  0   0   0   0   0   0   0  53   0   0
  0   0   0   0   0   0   0   0   2   0
  0   0   0   0   0   0   0   0   0   0
  0   0   0   0  60   0   0   0   0   0


2 压缩矩阵 (Compress Matrix)

压缩存储,一般是采用数组或列表形式存储它们。

我们要干的是:

  • 计算它们存储位置(下标)

  • 如何根据压缩结构还原成矩阵

(提示:在优快云的app中,公式有可能会乱码,可以用网页查看)

我们在这里,假设 n × n n \times n n×n 矩阵二维数组或向量的纵下标 i i i ,横下标 j j j ,压缩后下标 k k k 。它们都是从0开始。稀疏矩阵比较特殊。

压缩后数组长度size:

  • 上三角矩阵、下三角矩阵和对称矩阵: s i z e = n × ( n + 1 ) 2 size = \frac{n \times (n + 1)}{2} size=2n×(n+1)

  • 三对角矩阵(第一行,最后一行是2个元素,其余都是3个元素): s i z e = 3 × n − 2 size = 3 \times n - 2 size=3×n2

  • 稀疏矩阵:非零元素数量

矩阵下标转压缩数组下标 (按行)

  • 上三角方阵

    • i i i 行之前的元素数量: ( n − ( i − 1 ) ) + n 2 × i \frac{(n - (i - 1)) + n}{2} \times i 2(n(i1))+n×i
    • i i i 行第 j j j 列之前的元素数量: j − i j - i ji
    • 最终下标 k k k 为:
      k = ( 2 × n − i + 1 ) × i 2 + ( j − i ) k = \frac{(2 \times n - i + 1) \times i}{2} + (j - i) k=2(2×ni+1)×i+(ji)
  • 下三角方阵与对称矩阵

    • i i i 行之前的元素数量: ( 1 + i ) × i 2 \frac{(1 + i) \times i}{2} 2(1+i)×i
    • i i i 行第 j j j 列之前的元素数量: j j j
    • 最终下标 k k k 为:
      k = ( 1 + i ) × i 2 + j k = \frac{(1 + i) \times i}{2} + j k=2(1+i)×i+j
  • 三对角方阵

    • i i i 行之前的元素数量: 0 , ( i = 0 ) ; 3 × i − 1 , ( i > 0 ) 0,(i=0); \quad 3 \times i - 1, (i>0) 0,(i=0);3×i1,(i>0)
    • i i i 行第 j j j 列之前的元素数量: j , ( i = 0 ) ; j − i + 1 , ( i > 0 ) j ,(i=0); \quad j - i + 1,(i>0) j,(i=0);ji+1,(i>0)
    • 最终下标 k k k 为:
      k = 2 × i + j k = 2 \times i + j k=
### 特殊矩阵压缩存储方法 特殊矩阵是指具有特定规律性的矩阵,例如对称矩阵、三角矩阵、三对角矩阵以及稀疏矩阵等。这些矩阵由于其特殊的性质,在实际应用中可以通过压缩存储的方式减少内存占用并优化计算效率。 #### 对称矩阵压缩存储 对于一个 \(n \times n\) 的对称矩阵 \(A\),其中满足 \(a_{ij} = a_{ji}\) (\(0 \leq i, j < n\))。可以仅存储下三角部分(含主对角线),因为上三角部分的数据可以从下三角部分推导得出。 假设按照行优先顺序存储,则第 \(k\) 个元素的位置可通过如下公式计算[^1]: \[ k = \frac{i(i+1)}{2} + j \quad (i \geq j)\] 如果 \(i < j\),则交换 \(i\) 和 \(j\) 后再查找对应的存储位置。 ```python def symmetric_matrix_compress(matrix): compressed = [] n = len(matrix) for i in range(n): for j in range(i + 1): # 只遍历下半部分 compressed.append(matrix[i][j]) return compressed ``` --- #### 三角矩阵压缩存储 三角矩阵分为上三角矩阵和下三角矩阵两种情况。以上三角矩阵为例,只需存储主对角线及其上方的部分。同样采用行优先方式存储时,第 \(k\) 个元素的位置可由以下公式确定[^1]: \[ k = \frac{(i)(i+1)}{2} + j - i\] 如果是下三角矩阵,则需调整索引范围以适应不同的存储模式。 ```python def upper_triangular_compress(matrix): compressed = [] n = len(matrix) for i in range(n): for j in range(i, n): # 遍历上半部分 compressed.append(matrix[i][j]) return compressed ``` --- #### 三对角矩阵压缩存储 三对角矩阵的特点是只有主对角线及相邻两条对角线上存在非零元素。因此可以用三个一维数组分别表示这三条对角线上的值。设矩阵大小为 \(n \times n\),则每条对角线最多有 \(n\) 或 \(n-1\) 个元素[^1]。 ```python def tridiagonal_compress(matrix): main_diag = [] # 主对角线 lower_diag = [] # 下次对角线 upper_diag = [] # 上次对角线 n = len(matrix) for i in range(n): main_diag.append(matrix[i][i]) # 存储主对角线 if i > 0: lower_diag.append(matrix[i][i-1]) # 存储下次对角线 if i < n-1: upper_diag.append(matrix[i][i+1]) # 存储上次对角线 return {"main": main_diag, "lower": lower_diag, "upper": upper_diag} ``` --- #### 稀疏矩阵压缩存储 稀疏矩阵指的是大部分元素为零的矩阵。通常使用 **三元组表** 来存储非零元素的信息,即记录每个非零元素所在的行列坐标及其数值。这种方式不仅节省空间,还便于后续处理如转置等操作[^4]。 然而需要注意的是,在涉及加法、乘法等复杂运算时,可能需要频繁更新三元组中的内容或者重新构建新的三元组列表,从而带来额外开销[^2]。 ```python class SparseMatrix: def __init__(self, rows, cols): self.rows = rows self.cols = cols self.triple_list = [] def add_nonzero(self, row, col, value): """ 添加非零元素 """ self.triple_list.append((row, col, value)) def transpose(self): """ 转置稀疏矩阵 """ transposed = [(col, row, val) for row, col, val in self.triple_list] return sorted(transposed, key=lambda x: (x[0], x[1])) ``` --- ### 总结 通过上述几种常见的特殊矩阵压缩存储技术可以看出,合理利用矩阵特性能够显著降低资源消耗,并提升程序运行性能。但在选择具体的实现方案前应充分考虑应用场景需求,权衡不同策略之间的利弊。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值