矩阵的压缩存储

矩阵是科学与工程计算问题中常用的数学对象之一。

矩阵的存储

1、矩阵的二维数组描述

     矩阵用二维数组描述时,存储的密度为1。可以对其元素进行随机存取,各种矩阵运算也非常简单。

2、矩阵的压缩存储
    矩阵中非零元素呈某种规律分布或者矩阵中出现大量的零元素的情况下,为了节省存储空间,我们可以对这类矩阵进行压缩存储:即为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

特殊矩阵

     所谓特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵。常见的有对称矩阵、三角矩阵和对角矩阵等。
1.对称矩阵
(1)对称矩阵
     在一个n阶方阵A中,若元素满足下述性质: 
       aij=aji 0≤i,j≤n-1
则称A为对称矩阵。
【例】下图便是一个5阶对称矩阵。
                    

(2)对称矩阵的压缩存储
    对称矩阵中的元素关于主对角线对称,故只要存储矩阵中上三角或下三角中的元素,让每两个对称的元素共享一个存储空间。这样,能节约近一半的存储空间。
①按"行优先顺序"存储主对角线(包括对角线)以下的元素
          
    即按a00,a10,a11,……,an-1,0,an-1,1…,an-1,n-1次序存放在一个向量sa[0..n(n+1)/2-1]中(下三角矩阵中,元素总数为n(n+1)/2)。
    其中:
         sa[0]= a00 ,
         sa[1] = a10 ,
         ……,
         sa[n(n+1)/2-1]= an-1,n-1
②元素aij的存放位置
    aij元素前有i行(从第0行到第i-1行),一共有:
         1+2+…+i=i×(i+1)/2个元素;
    在第i行上,aij之前恰有j个元素(即ai0,ail,…,ai,j-1),因此有:
           sa[i×(i+1)/2+j]= aij 
③aij和sa[k]之间的对应关系:
    若i≥j,k=i×(i+1)/2+j   0≤k<n(n+1)/2
    若i<j,k=j×(j+1)/2+i   0≤k<n(n+1)/2
    令I=max(i,j),J=min(i,j),则k和i,j的对应关系可统一为:
         k=i×(i+1)/2+j 0≤k<n(n+1)/2 

(3)对称矩阵的地址计算公式
  LOC(aij)=LOC(sa[k])
          =LOC(sa[0])+k×d=LOC(sa[0])+[I×(I+1)/2+J]×d
    通过下标变换公式,能立即找到矩阵元素aij在其压缩存储表示sa中的对应位置k。因此是随机存取结构。
  【例】a21和a12均存储在sa[4]中,这是因为
      
上一页

2、三角矩阵  
(1)三角矩阵的划分
     以主对角线划分,三角矩阵有上三角矩阵和下三角矩阵两种。
①上三角矩阵
     如下图(a)所示,它的下三角(不包括主角线)中的元素均为常数c。
②下三角矩阵
     与上三角矩阵相反,它的主对角线上方均为常数c,如下图(b)所示。
  注意:
     在多数情况下,三角矩阵的常数c为零。

    

(2)三角矩阵的压缩存储
    三角矩阵中的重复元素c可共享一个存储空间,其余的元素正好有n×(n+1)/2个,因此,三角矩阵可压缩存储到向量sa[0..n(n+1)/2]中,其中c存放在向量的最后一个分量中。
  
 
 上三角矩阵中aij和sa[k]之间的对应关系
     上三角矩阵中,主对角线之上的第p行(0≤p<n)恰有n-p个元素,按行优先顺序存放上三角矩阵中的元素aij时:
     aij元素前有i行(从第0行到第i-1行),一共有:
        (n-0)+(n-1)+(n-2)+…+(n-i)=i×(2n-i+1)/2个元素;
     在第i行上,aij之前恰有j-i个元素(即aij,ai,j+l,…,ai,j-1),因此有:
          sa[i×(2n-i+1)/2+j-i]= aij 
所以:
     ┌i×(2n-i+1)/2+j-i 当i≤j
   k=│
      └n×(n+1)/2 当i>j

②下三角矩阵中aij和sa[k]之间的对应关系
      ┌i×(i+1)/2+j 当i≥j
    k=│
      └n×(n+1)/2 当i<j

  注意:
     三角矩阵的压缩存储结构是随机存取结构。

3.对角矩阵
     所有的非零元素集中在以主对角线为中心的带状区域中,即除了主对角线和主对角线相邻两侧的若干条对角线上的元素之外,其余元素皆为零的矩阵为对角矩阵。
  【例】下图给出了一个三对角矩阵。
            
     其中:
    非零元素仅出现在主对角上(aii,0≤i≤n-1),紧邻主对角线上面的那条对角线上(ai,i+1 ,0≤i≤n-2)和紧邻主对角线下面的那条对角线上(a i+1,i,0≤i≤n-2)。当|i-j|>1时,元素aij=0。
     由此可知,一个k对角线矩阵(k为奇数)A是满足下述条件的矩阵:
            若|i-j|>(k-1)/2,则元素aij=0。
     对角矩阵可按行优先顺序或对角线的顺序,将其压缩存储到一个向量中,并且也能找到每个非零元素和向量下标的对应关系。
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值