特殊矩阵的压缩存储(上)

概述:主要是推导出上/下三角矩阵、对称矩阵存储在一维数组中的方法
a.下三角矩阵
    一个n×n阶矩阵,i为行下标,j为列下标,i>=j的部分构成的三角矩阵,称为下三角矩阵,形式如下:
    
   

 a[0,0]
 a[1,0]  a[1,1]
 a[2,0]  a[2,1]  a[2,2]

     存储一个矩阵最直观的就是用二维数组存储,如果用一维数组存储的话,就会有一个下标转换的问题,下三角矩阵转化为一维数组时,一维数组下标和矩阵元素的对应关系如下:
    
   

array[0]
array[1]  array[2]
array[3]  array[4]  array[5]


    
    很容易可以发现,在每一行中,第一个以后的下标都是第一个下标加上对应矩阵的列下标,如第三行第一个下标为3,第三行第三列对应的矩阵列下标为2,所以第三行第三列的下标为3+2=5;每一行第一个下标取值则取决于前面所有行的元素个数总和,可以发现,每一行包含的元素个数是一个等差数列,所以下标为i的行(第i+1行),前面的元素共有 ((1+i)*i)/2 个,也就是下标为i的行,其第一个下标为 ((1+i)*i)/2,所以得到下三角矩阵用一维数组存储时,矩阵下标i、j和一维数组下标k的对应关系如下:
    
            k = ((1+i)*i)/2+j   (i>=j)
    
    这个公式的含义是:在下三角矩阵中,a[i,j]位置对应的值存储在array[k]中
    
b.上三角矩阵
    一个n×n阶矩阵,i为行下标,j为列下标,i=<j的部分构成的三角矩阵,称为下三角矩阵,形式如下:
  

 a[0,0]  a[0,1]  a[0,2]
         a[1,1]  a[1,2]
                 a[2,2]

    
    上三角矩阵转化为一维数组时,一维数组下标和矩阵元素的对应关系如下:
   

array[0]  array[1]  array[2]
          array[3]  array[4]
                    array[5]

    类似下三角矩阵,上三角矩阵中,下标为i的行,第一个以后的下标都是第一个下标加上对应矩阵的(列下标-行下标),如第二行第一个下标为3,第二行第三列对应的矩阵列下标为2,行下标为1,所以第二行第三列的下标为3+(2-1)=4;每一行第一个下标取值则取决于前面所有行的元素个数总和,同样是一个等差数列,所以下标为i的行(第i+1行),前面的元素共有 ((n+n-(i-1))*i)/2 = ((2n-i+1)*i)/2 个,也就是下标为i的行,其第一个下标为 ((2n-i+1)*i)/2,所以得到上三角矩阵用一维数组存储时,矩阵下标i、j和一维数组下标k的对应关系如下:
    
            k = ((2n-i+1)*i)/2+j-i   (i<=j)
    
    含义同上:在上三角矩阵中,a[i,j]位置对应的值存储在array[k]中
    
c.对称矩阵
    对称矩阵是指矩阵元素满足 a[i,j]=a[j,i] 的矩阵。
    
    在进行压缩存储时,可以只存储主对角线和上/下部分元素,一个n阶矩阵,只需要 n(n+1)/2 个存储单元。为了方便,我们采用存储主对角线和下半部分的方式(即存储下三角矩阵),其中下半部分,一维数组下标和矩阵下标的对应关系和下三角矩阵一样;上半部分,由于 a[i,j]=a[j,i] 所以只需要把i和j互换即可,得到的矩阵下标i、j和一维数组下标k的对应关系如下:
    
            k = ((1+i)*i)/2+j   (i>=j)
            k = ((1+j)*j)/2+i   (i<j)
    
    含义同上:在对称矩阵中,a[i,j]位置对应的值存储在array[k]中
    
d.对角矩阵
    如果一个矩阵的所有非零元素都集中在以主对角线为中心的带状区域,该矩阵就称为对角矩阵。
    
    这里主要讨论主对角矩阵和三对角矩阵。一个矩阵除了主对角线上的元素外,其余元素全部为0,则为主对角矩阵;除了主对角线及主对角线上下各一个元素外,其余元素全部为0,则为三对角矩阵。
    
    对于主对角矩阵,矩阵下标i、j和一维数组下标k的对应关系很简单:
    
            k=i 或 k=j
    
    对于三对角矩阵,除了第一行和最后一行是两个元素,其它行都是三个元素,所以下标为i(i>0)的行,前面行的元素共有 3*i-1 个,该行第一个元素前面有 i-1 个元素不属于这三条对角线,所以对于三对角矩阵,矩阵下标i、j和一维数组下标k的对应关系如下:
    
            k = (3*i-1)+(j-(i-1)) = 2*i+j
    
    对于任意m对角矩阵,其矩阵下标i、j和一维数组小标k的对应关系比较复杂,这里不再讨论。有兴趣的可以阅读下面的论文:
    m条对角线的n阶对角矩阵压缩存储的通用寻址公式

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值