稀疏矩阵算法

您所在的位置:网站首页 稀疏矩阵三元组存储结构 稀疏矩阵算法

稀疏矩阵算法

2024-06-30 15:22| 来源: 网络整理| 查看: 265

1、稀疏矩阵的压缩存储     为了节省存储单元,可只存储非零元素。由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须存储非零元素所在的行号、列号,才能迅速确定一个非零元素是矩阵中的哪一个元素。稀疏矩阵的压缩存储会失去随机存取功能。     其中每一个非零元素所在的行号、列号和值组成一个三元组(i,j,aij),并由此三元组惟一确定。     稀疏矩阵进行压缩存储通常有两类方法:顺序存储和链式存储。链式存储方法。2、三元组表     将表示稀疏矩阵的非零元素的三元组按行优先(或列优先)的顺序排列(跳过零元素),并依次存放在向量中,这种稀疏矩阵的顺序存储结构称为三元组表。  注意:     以下的讨论中,均假定三元组是按行优先顺序排列的。      (1)三元组表的类型说明     为了运算方便,将矩阵的总行数、总列数及非零元素的总数均作为三元组表的属性进行描述。其类型描述为:  #define MaxSize 10000 //由用户定义  typedef int DataType; //由用户定义  typedef struct { //三元组    int i,j;//非零元的行、列号    DataType v; //非零元的值   }TriTupleNode;  typedef struct{ //三元组表    TriTupleNode data[MaxSize]; //三元组表空间    int m,n,t; //矩阵的行数、列数及非零元个数  }TriTupleTable;      (2) 压缩存储结构上矩阵的转置运算    一个m×n的矩阵A,它的转置矩阵B是一个n×m的矩阵,且:         A[i][j]=B[j][i],0≤idata。②三元组表的转置     方法一:简单地交换a->data中i和j中的内容,得到按列优先顺序存储倒b->data;再将b->data重排成按行优先顺序的三元组表。     方法二:由于A的列是B的行,因此,按a->data的列序转置,所得到的转置矩阵B的三元组表b->data必定是按行优先存放的。     按这种方法设计的算法,其基本思想是:对A中的每一列col(0≤col≤a->n-1),通过从头至尾扫描三元组表a->data,找出所有列号等于col的那些三元组,将它们的行号和列号互换后依次放人b->data中,即可得到B的按行优先的压缩存贮表示。

 

下面是完整的稀疏矩阵算法,包括加法,转置,乘法等

 

#include #include #define A 6#define B 7#define A1 3#define B1 4#define A2 4#define B2 2#define OK 1#define ERROR -1;#define MAXSIZE 1000

typedef int Status; typedef int ElemType;typedef struct {  int i,j;  ElemType e;}Triple;        typedef struct {  Triple data[MAXSIZE+1];  int rpos[MAXSIZE+1];  int mu,nu,tu;}TSMatrix;       

void CreatTripleTable (int array_a[A][B],TSMatrix *a)/*array_aÊÇÒ»¸öÏ¡Êè¾ØÕó,aÊDzúÉúµÄÏà¶ÔÓ¦µÄÈýÔª×é´æ´¢*/{                                                       int i,j,k=1;  //a->data=(Triple *)malloc((MAXSIZE+1)*sizeof(Triple));  for (i=0;idata[k].j=j+1;        a->data[k].e = array_a[i][j];        //printf("i=%d/n",a->data[k].i);         //printf("j=%d/n",a->data[k].j);        //printf("e=%d/n",a->data[k].e);        //printf("k=%d/n",k);         //printf("/n");        k++;      }  a->mu=A;  a->nu=B; // data[0][1]=N;  a->tu=k-1;/*´æÈë·Ç0ÔªËظöÊý*/}/*CreatTripleTable*/

void CreatTripleTable1 (int array_a[A1][B1],TSMatrix *a)/*array_aÊÇÒ»¸öÏ¡Êè¾ØÕó,aÊDzúÉúµÄÏà¶ÔÓ¦µÄÈýÔª×é´æ´¢*/{                                                       int i,j,k=1;  //a->data=(Triple *)malloc((MAXSIZE+1)*sizeof(Triple));  for (i=0;idata[k].j=j+1;        a->data[k].e = array_a[i][j];        k++;      }  a->mu=A1;  a->nu=B1;  a->tu=k-1;/*´æÈë·Ç0ÔªËظöÊý*/}

void CreatTripleTable2 (int array_a[A2][B2],TSMatrix *a)/*array_aÊÇÒ»¸öÏ¡Êè¾ØÕó,aÊDzúÉúµÄÏà¶ÔÓ¦µÄÈýÔª×é´æ´¢*/{                                                       int i,j,k=1;  //a->data=(Triple *)malloc((MAXSIZE+1)*sizeof(Triple));  for (i=0;idata[k].j=j+1;        a->data[k].e = array_a[i][j];        k++;      }  a->mu=A2;  a->nu=B2;  a->tu=k-1;/*´æÈë·Ç0ÔªËظöÊý*/}

Status TransposeSMatrix(TSMatrix *M,TSMatrix *T) {  int p,q,col;        T->mu=M->nu;  T->nu=M->mu;  T->tu=M->tu;  if (T->tu) {    q=1;    for (col=1;colnu;++col)      for (p=1;ptu;++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;        }      }            return OK;}

Status FastTransposeSMatrix(TSMatrix *M,TSMatrix *T) {  int t,p,q,col,num[A],cpot[M->nu];        T->mu=M->mu;  T->nu=M->mu;  T->tu=M->tu;  if (T->tu) {    for (col=1;colnu;++col) num[col]=0;    for (t=1;ttu;++t) ++num[M->data[t].j];    cpot[1]=1;    for (col=2;colnu;++col) cpot[col]=cpot[col-1]+num[col-1];    for (p=1;ptu;++p) {      col=M->data[p].j;   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];    }      }                  return OK;}  

Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *C)//ÈýÔª×é±íʾµÄÏ¡Êè¾ØÕó¼Ó·¨{  int i,j,x,ce,pa,pb,pc;     if (M.mu!=N.mu || M.nu!=N.nu) return ERROR;  C->mu=M.mu;C->nu=M.nu;C->tu=0;  pa=1;pb=1;pc=1;  for(x=1;xdata[pc].e=ce;          pa++;pb++;pc++;        }      }//if      else if(M.data[pa].j>N.data[pb].j)       {        C->data[pc].i=x;        C->data[pc].j=N.data[pb].j;        C->data[pc].e=N.data[pb].e;        pb++;pc++;      }      else      {        C->data[pc].i=x;        C->data[pc].j=M.data[pa].j;        C->data[pc].e=M.data[pa].e;        pa++;pc++;      }    }//while    while(M.data[pa].i==x) //²åÈëAÖÐÊ£ÓàµÄÔªËØ(µÚxÐÐ)    {      C->data[pc].i=x;      C->data[pc].j=M.data[pa].j;      C->data[pc].e=M.data[pa].e;      pa++;pc++;    }    while(N.data[pb].i==x) //²åÈëBÖÐÊ£ÓàµÄÔªËØ(µÚxÐÐ)    {      C->data[pc].i=x;      C->data[pc].j=N.data[pb].j;      C->data[pc].e=N.data[pb].e;      pb++;pc++;    }  }//for  C->tu=pc;  return OK;}//TSMatrix_Add  

void PrintSMatrix(TSMatrix M){  int i,j,pa;    int a[M.mu][M.nu];   pa=1;  for (i=0;irpos[row]=M->rpos[row-1]+num[row-1];  for (t=1;tmu;++t) printf("%d/n",M->rpos[t]);}                

Status MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q) {  int arrow,brow,tp,p,q,t,ccol,ctemp[Q->nu];       if (M.nu!=N.mu) return ERROR;   Q->mu=M.mu;  Q->nu=N.nu;  Q->tu=0;  if (M.tu*N.tu!=0) {        for (arrow=1;arrowtu+1;      if (arrowtu].i=arrow;          Q->data[Q->tu].j=ccol;           Q->data[Q->tu].e=ctemp[ccol];        }       }         }   }      

void DestroySMatrix(TSMatrix M){  M.mu=0;  M.nu=0;  M.tu=0;   }                       int main(int argc, char *argv[]){  TSMatrix a,b,c,d,e;  //Èç¹ûдΪ*a£¬Ôò±ØÐë¼ÓÉÏa=(TSMatrix *)malloc(sizeof(TSMatrix)),»ò¼ÓÒ»TSMatrix b,a=&b;   TSMatrix aa,bb,cc;  int array[A][B]={{0,12,9,0,0,0,0},{0,0,0,0,0,0,0},{-3,0,0,0,0,14,0},{0,0,24,0,0,0,0},{0,18,0,0,0,0,0},{15,0,0,-7,0,0,0}};  int array1[A][B]={{0,12,3,4,0,0,0},{0,0,0,3,0,0,0},{-3,0,0,0,0,14,0},{0,0,24,0,0,0,0},{0,18,0,0,0,0,0},{15,0,0,-7,0,0,0}};    int array2[A1][B1]={{3,0,0,5},{0,-1,0,0},{2,0,0,0}};  int array3[A2][B2]={{0,2},{1,0},{-2,4},{0,0}};    //a=(TSMatrix *)malloc(sizeof(TSMatrix));    CreatTripleTable(array,&a);  PrintSMatrix(a);  printf("Transpose/n");  TransposeSMatrix(&a,&c);  PrintSMatrix(c);  printf("Fast Transpose/n");  FastTransposeSMatrix(&a,&d);  PrintSMatrix(d);        printf("Add Transpose/n");  CreatTripleTable(array1,&b);    TSMatrix_Add(a,b,&e);  PrintSMatrix(e);      CreatTripleTable1(array2,&aa);  PrintSMatrix(aa);  CreatTripleTable2(array3,&bb);  PrintSMatrix(bb);  GetRpos(&aa);  GetRpos(&bb);  MultSMatrix(aa,bb,&cc);  PrintSMatrix(cc);

  DestroySMatrix(a);  DestroySMatrix(b);                  DestroySMatrix(c);  DestroySMatrix(aa);  DestroySMatrix(bb);                  DestroySMatrix(cc);  system("PAUSE");   return 0;}



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3