35、矩阵(稀疏矩阵)的压缩存储(一)

为了节省存储空间并且加快处理速度,需要对这类矩阵进行压缩存储,压缩存储的原则是:不重复存储相同元素;不存储零值元素。

一、相关概念

㈠特殊矩阵:矩阵中存在大多数值相同的元,或非0元,且在矩阵中的分布有一定规律。

⒈对称矩阵:矩阵中的元素满足

                   aij=aji    1≤i,j≤n

⒉三角矩阵:上(下)三角矩阵指矩阵的下(上)三角(不包括对角线)中的元素均为常数c或0的n阶矩阵。

⒊对角矩阵(带状矩阵):矩阵中所有非0元素集中在主对角线为中心的区域中。

㈡稀疏矩阵:非0元素很少(≤ 5%)且分布无规律。

二、存储结构及算法思想

1、对称矩阵

存储分配策略: 每一对对称元只分配一个存储单元,即只存储下三角(包括对角线)的元, 所需空间数为:  n(n+1)/2。

存储分配方法: 用一维数组sa[n(n+1)/2]作为存储结构。

             sa[k]与aij之间的对应关系为:

2、三角矩阵

也是一个n阶方阵,有上三角和下三角矩阵。下(上)三角矩阵是主对角线以上(下)元素均为零的n阶矩阵。设以一维数组sb[0..n(n+1)/2]作为n阶三角矩阵B的存储结构,仍采用按行存储方案,则B中任一元素bi,j和sb[k]之间仍然有如上的对应关系,只是还需要再加一个存储常数c的存储空间即可。如在下三角矩阵中,用n(n+1)/2的位置来存储常数。

对特殊矩阵的压缩存储实质上就是将二维矩阵中的部分元素按照某种方案排列到一维数组中,不同的排列方案也就对应不同的存储方案

2、稀疏矩阵

常见的有三元组表示法、带辅助行向量的二元组表示法(也即行逻辑链表的顺序表),十字链表表示法等。

1)、三元组表示法

三元组表示法就是在存储非零元的同时,存储该元素所对应的行下标和列下标。稀疏矩阵中的每一个非零元素由一个三元组(i,j,aij)唯一确定。矩阵中所有非零元素存放在由三元组组成的数组中。


在此,data域中表示非零元的三元组是以行序为主序顺序排列的。

以下看如何利用三元组表示法来实现矩阵的转置。

(1)按照b.data中三元组的次序依次在a.data中找出相应的三元组进行转置。换句话说,按照矩阵M的列序进行转置。为了找到M的每一列中所有的非零元素,需要对其三元组表a.data从第一行起整个扫描一遍。由于a.data是以M的行序为存放每个非零元的,由此得到的恰好是b.data应有的顺序。

2)、带辅助行向量的二元组表示法及十字链表表示法在下一节中学习介绍。

三、存储结构及C语言描述

1三元组表示法

1按照b矩阵中的行次序依次在a.data中找到相应的三元组进行转置。

2)快速转置:按照a.data中三元组的次序进行转置,并将转置后的三元组放到b.data中的恰当位置。

    恰当位置的确定:首先计算M矩阵的每一列(即T的每一行)中非0元的个数,然后求得M矩阵每一列第一个非0元在b.data中的位置。

    算法基本思想:

    设置两个向量:

     num[col]:第col列的非零元素个数。

     cpot[col]:第col列第一个非零元在b.data中的恰当位置。

         在转置过程中,指示该列下一个非零元在b.data中的位置。

    1、num[col]的计算:

         顺序扫描a.data三元组,累计各列非0元个数。

    2、cpot[col]计算:

2)、带辅助行向量的二元组表示法及十字链表表示法在下一节中学习介绍。

四、算法的C语言实现

#include"stdio.h"

#include"stdlib.h"

#defineMAXSIZE 12500

#defineOK 1

typedefint ElemType;

typedefstruct 

{

inti,j;

ElemTypee;

}Triple;

typedefstruct

{

Tripledata[MAXSIZE+1];

intmu,nu,tu;   //矩阵行数,列数和非0元个数

}TSMatrix;

intcpot[MAXSIZE+1],num[MAXSIZE+1];

intTransposeSMatrix(TSMatrix M,TSMatrix &T)

{

T.mu=M.nu;

T.nu=M.mu;

T.tu=M.tu;

if(T.tu)

  {

   int q=1;

   for(int col=1;col<=M.nu;++col)

         for(int p=1;p<=M.tu;++p)

                if(M.data[p].j==col)

                {

                T.data[q].i=M.data[p].j;

                T.data[q].j=M.data[p].i;

                T.data[q].e=M.data[p].e;

                ++q;

                }//if

  }//if

returnOK;

}//TransposeSMatrix

 

intInPutM(TSMatrix &M)

{

printf("inputnu mu tu(With a space interval)of a Matrix:\n");

scanf("%d%d %d",&M.nu,&M.mu,&M.tu); //row,colume,and tu

printf("Pleaseinput the data of Matrix:\n");

for(intc=1;c<=M.tu;c++) 

   {

    scanf("%d",&M.data[c].i);

       scanf("%d",&M.data[c].j);

       scanf("%d",&M.data[c].e);

   }//for

return1;

}//InPut

intPrintM(TSMatrix T)

{

printf("Matrixafter transpose is:\n");

for(intc=1;c<=T.tu;c++) 

   {

    printf("%d %d%d\n",T.data[c].i,T.data[c].j,T.data[c].e);

   }//for

return1;

}//InPut

intFastTransposeSMatrix(TSMatrix M,TSMatrix &T)

{

T.mu=M.nu;

T.nu=M.mu;

T.tu=M.tu;

if(T.tu)

  {

  for(int col=1;col<=M.mu;++col) num[col]=0;

  for(int t=1;t<=M.tu;++t)++num[M.data[t].j]; //记述M.data[t].j列

                                          //非0元的个数

  cpot[1]=1;

  //求第col列中第一个非零元在b.data(T)中的序号

  for(int col=2;col<=M.mu;++col)

        cpot[col]=cpot[col-1]+num[col-1];

  for(int p=1;p<=M.tu;++p)

         {

        int col=M.data[p].j;

      int q=cpot[col];

        T.data[q].i=M.data[p].j;

        T.data[q].j=M.data[p].i;

        T.data[q].e=M.data[p].e;

        ++cpot[col];

      }//for

  }//if

returnOK;

}//FastTransposeSMatrix

intmain()

{

TSMatrixM,T;

InPutM(M);

//TransposeSMatrix(M,T);

FastTransposeSMatrix(M,T);

PrintM(T);

returnOK;

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
稀疏矩阵压缩存储是一种优化矩阵存储空间的方式。当矩阵中大部分元素为0或者重复元素较多时,采用传统的二维数组存储方式会导致存储空间的浪费,因此采用稀疏矩阵压缩存储可以节省存储空间。 稀疏矩阵压缩存储的思路是将稀疏矩阵中的非零元素按照行优先的原则逐个存储起来,同时还需要记录每个非零元素的行号、列号以及其对应的值。压缩存储后的矩阵可以表示为一个线性数组,数组的每个元素都包含三个部分:行号、列号和元素值。这样可以避免存储大量的0元素,从而减少存储空间的开销。 在进行矩阵压缩存储时,可以采用稀疏矩阵的三元组存储方法,即将非零元素的行号、列号和值分别存储在三个单独的一维数组中。实际应用中,还可以基于三元组存储方法的基础上进行进一步的优化,例如使用链表结构来存储非零元素,以减少内存的消耗。 此外,在稀疏矩阵压缩存储过程中,还需要考虑到数据的读取和修改操作。读取非零元素时,可以直接通过行号和列号索引到相应的元素,而修改非零元素时,需要先找到对应的索引再进行修改。 总体来说,稀疏矩阵压缩存储是通过将稀疏矩阵中的非零元素存储起来,避免存储大量的0元素,从而减少存储空间的开销。具体的实现方法可以采用稀疏矩阵的三元组存储方法或其他优化方式,以提高存储效率和减少内存消耗。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值