408DS-矩阵的压缩存储

写在前面,在计算机中,存储矩阵一般采用的都是二维数组,但是有些矩阵的元素有一些规律,所以引入了矩阵的压缩存储,即把大型的稀疏矩阵或元素有规律的矩阵存到一维数组中,以达到节省存储空间的目的.
矩阵的压缩存储主要针对:三角矩阵(上三角,下三角),对称阵,反对称阵,三对角矩阵,对角矩阵和大型稀疏矩阵,下面分别介绍之.

先做一个概念区分,即矩阵的下标和数组的下标;对于矩阵元素,我们常用 a i j a_{ij} aij表示第 i i i行,第 j j j列的元素( i , j i,j i,j均是从 1 1 1开始的),而数组下标我们常用 A [ k ] A[k] A[k]这样的形式,这里的 k k k在计算机中是从 0 0 0开始的,但是有时题目也会要求从 1 1 1开始.所以注意数组下标和矩阵的下标不是一回事.

  • 三角矩阵:

    • 上三角矩阵

      对于 n × n n\times n n×n的上三角矩阵来说,它的第一行有 n n n个元素,第二行有 n − 1 n-1 n1个元素,依此类推;所以它一共需要 ( 1 + n ) × n 2 + 1 {(1+n)\times n \over 2}+1 2(1+n)×n+1个存储单元( + 1 +1 +1是因为除了上三角以外的其他元素有可能不为0,但是一定其他元素一定都是相等的;那么就用最后一个存储单元存放).

      行优先存储: a i j a_{ij} aij在数组存放的位置的前 i − 1 i-1 i1行共有: ( i − 1 ) × ( 2 n − i + 2 ) 2 (i-1)\times(2n-i+2) \over 2 2(i1)×(2ni+2)个元素, a i j a_{ij} aij是第 i i i行的第 j − i + 1 j-i+1 ji+1个元素,它应该被存放在第 ( i − 1 ) × ( 2 n − i + 2 ) 2 + j − i + 1 {(i-1)\times(2n-i+2) \over 2}+j-i+1 2(i1)×(2ni+2)+ji+1个存储单元,那么此时对应的数组下标就是上述式子 − 1 -1 1若下标从 0 0 0开始,或者不减 1 1 1,数组下标从 1 1 1开始.

      列优先存储: a i j a_{ij} aij在数组存放的位置的前 j − 1 j-1 j1列共有: ( j − 1 ) × j 2 (j-1)\times j \over 2 2(j1)×j个元素, a i j a_{ij} aij是第 j j j列的第 i i i个元素,它应该被存放在 ( j − 1 ) × j 2 + i {(j-1)\times j \over 2}+i 2(j1)×j+i,和行有限一样,减不减 1 1 1取决于从数组下标从 0 0 0开始还是从 1 1 1开始.

    • 下三角矩阵

      下三角矩阵的存储单元数量和上三角是一样的,不再赘述.

      行优先存储:还是一样分析前 i − 1 i-1 i1行共有 ( i − 1 ) × i 2 (i-1)\times i \over 2 2(i1)×i个元素, a i j a_{ij} aij是第 i i i行的第 j j j个元素,它是第 i i i行第 j j j个元素,所以它应该被存放在第 ( i − 1 ) × i 2 + j {(i-1)\times i \over 2}+j 2(i1)×i+j个存储单元,若数组下标从 0 0 0开始,就 − 1 -1 1,若数组下标从 1 1 1开始,就是上述式子.

      列优先存储:前 j − 1 j-1 j1列共有 ( j − 1 ) × ( 2 n − j + 2 ) 2 (j-1)\times(2n-j+2) \over 2 2(j1)×(2nj+2)个元素, a i j a_{ij} aij是第 j j j列的第 i − j + 1 i-j+1 ij+1个元素,所以它应该被存放在第 ( i − 1 ) × i 2 + i − j + 1 {(i-1)\times i \over 2}+i-j+1 2(i1)×i+ij+1个存储单元,若数组下标从 0 0 0开始,就 − 1 -1 1,若数组下标从 1 1 1开始,就是上述式子.

  • 对称矩阵:

    • 普通对称矩阵

      对称矩阵和三角矩阵差不多,只需要存一个三角矩阵即可,因为对调 i j ij ij就可以得到另一半的元素.所以这里看个人喜好是存上三角还是下三角,所以存一个对称矩阵可以基本等价于存放一个三角矩阵,唯一的区别就是对称矩阵确定只需要 ( 1 + n ) × n 2 (1+n)\times n \over 2 2(1+n)×n个存储单元.

    • 反对称矩阵

      反对称矩阵有些许区别,是因为它的对角元素一定是 0 0 0,所以它不需要存放对角线元素,那么一共需要 ( n − 1 ) × n 2 (n-1)\times n \over 2 2(n1)×n个存储单元.另一半元素只需要将 i j ij ij对调并取相反数即可.这里以存下三角矩阵为例.唯一的区别就是它在求前 i − 1 i-1 i1行的和时,不是 1 + 2 + . . . + i − 1 1+2+...+i-1 1+2+...+i1,而是 0 + 1 + . . . + i − 2 0+1+...+i-2 0+1+...+i2.

  • 三对角矩阵

    假设 n × n n \times n n×n的三对角矩阵,共需要 4 + ( n − 2 ) × 3 = 3 n − 2 4+(n-2)\times3 = 3n-2 4+(n2)×3=3n2个存储单元,三对角矩阵元素比较有特点,我们只需要讨论 a i i a_{ii} aii以及 a i , i − 1 , a i , i + 1 a_{i,i-1},a_{i,i+1} ai,i1,ai,i+1即可.
    一般而言,虽然三对角矩阵也可以按列压缩,但实际上我们只考虑按行压缩,这是因为只需要将 i j ij ij对调就可以得到按列压缩的结果.
    对于 a i i , i > 1 a_{ii},i>1 aii,i>1来说,它所在的位置为第 2 + ( i − 1 ) × 3 + 2 2+(i-1)\times 3 +2 2+(i1)×3+2个存储单元,根据数组下标从 0 0 0还是 1 1 1开始决定要不要 − 1 -1 1即可.

    在三对角矩阵中,还常常会有给出数组下标,求在三对角矩阵中的位置.

    假设此时存放数组下标为 m m m的位置(数组下标从0开始),那么根据上面的式子便可以得到 m = 2 + ( i − 1 ) × 3 + 1 m=2+(i-1)\times3+1 m=2+(i1)×3+1.可以看到 m + 1 = 3 i + 1 m+1=3i+1 m+1=3i+1,所以便有 i = ( m + 1 ) / / 3 i=(m+1)//3 i=(m+1)//3;那这个元素在第 i i i行的偏移量即为 ( m + 1 ) % 3 (m+1)\%3 (m+1)%3.

  • 稀疏矩阵

    稀疏矩阵的特点是,矩阵规模非常大的同时元素很少,所以利用上面这些方式都不太方便,所以存储稀疏矩阵一般是直接存坐标+值,在C++里,可以使用tuple实现.考虑稀疏矩阵最后一行或者最后一列全为 0 0 0,假设最后一个非零元素出现在 n − 1 n-1 n1行,那么实际上对于计算机来说,它只能认为这个矩阵只有 n − 1 n-1 n1行,所以会丢失矩阵规模的信息,于是我们还需要额外存一下矩阵行数和列数.利用这种方式的一大问题就是,会失去矩阵随机存取的特性.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值