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

编程基础 - 特殊矩阵的压缩存储 (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)

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

我们要干的是:

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

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

(提示:在CSDN的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);
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
稀疏矩阵压缩存储方法是一种优化矩阵存储空间的方法,它只存储非零元素及其对应的行列索引。常见的稀疏矩阵压缩存储方法有三种:COO(Coordinate),CSR(Compressed Sparse Row)和CSC(Compressed Sparse Column)。 1. COO(Coordinate)方法: COO方法是最简单的稀疏矩阵压缩存储方法,它将非零元素的值、行索引和列索引分别存储在三个数组中。例如,对于一个3x3的矩阵: ``` 1 0 0 0 2 0 0 0 3 ``` 使用COO方法进行压缩存储,可以得到以下三个数组: ``` values = [1, 2, 3] rows = [0, 1, 2] cols = [0, 1, 2] ``` 其中,values数组存储非零元素的值,rows数组存储非零元素的行索引,cols数组存储非零元素的列索引。 2. CSR(Compressed Sparse Row)方法: CSR方法是一种按行压缩存储稀疏矩阵的方法。它使用三个数组来存储非零元素的值、列索引和行偏移量。行偏移量数组存储每一行的非零元素在values和cols数组中的起始位置。例如,对于上述的矩阵,使用CSR方法进行压缩存储,可以得到以下三个数组: ``` values = [1, 2, 3] cols = [0, 1, 2] row_offsets = [0, 1, 2, 3] ``` 其中,values数组和cols数组的含义与COO方法相同,row_offsets数组存储每一行的非零元素在values和cols数组中的起始位置。 3. CSC(Compressed Sparse Column)方法: CSC方法是一种按列压缩存储稀疏矩阵的方法。它使用三个数组来存储非零元素的值、行索引和列偏移量。列偏移量数组存储每一列的非零元素在values和rows数组中的起始位置。例如,对于上述的矩阵,使用CSC方法进行压缩存储,可以得到以下三个数组: ``` values = [1, 2, 3] rows = [0, 1, 2] col_offsets = [0, 1, 2, 3] ``` 其中,values数组和rows数组的含义与COO方法相同,col_offsets数组存储每一列的非零元素在values和rows数组中的起始位置。 这三种稀疏矩阵压缩存储方法各有优缺点,选择哪种方法取决于具体的应用场景和对存储空间和计算效率的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值