编程基础 - 特殊矩阵的压缩存储 (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×n−2
-
稀疏矩阵:非零元素数量
矩阵下标转压缩数组下标 (按行) :
-
上三角方阵
- 第 i i i 行之前的元素数量: ( n − ( i − 1 ) ) + n 2 × i \frac{(n - (i - 1)) + n}{2} \times i 2(n−(i−1))+n×i
- 第 i i i 行第 j j j 列之前的元素数量: j − i j - i j−i
- 最终下标 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×n−i+1)×i+(j−i)
-
下三角方阵与对称矩阵
- 第 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);