用三元组表示的稀疏矩阵的相乘和转置【永利澳门游戏网址304】,写一个创建稀疏矩阵相应三元组的算法

   a.data[0][0]=M;

typedef struct
{
 Triple data[MAX+1];/*非零元伊利组表,data[0]未用*/
 int mu,nu,tu;/*矩阵的行数,列数,非零元的个数*/
 int rpos[MAX+1];/*各行第三个非零元的地点表*/
}Matrix;

int
i,j,k=1;

/*用安慕希组表示的疏散矩阵M和N相乘的函数*/
void MulMatrix(Matrix M,Matrix N,Matrix *Q)
{
   int t,p,q,tp,k,arow,brow,ccol,ctemp[MAX],num[MAX];
   if(M.nu!=N.mu) 
printf(“error”);/*一旦M矩阵的列数不等于N矩阵的行数输出错误音信*/
   /* 起先化Q的行数,列数和非零元的个数*/
   Q->mu=M.mu;
   Q->nu=N.nu;
   Q->tu=0;
   if(M.tu*N.tu!=0)/*假设Q是非零矩阵继续下边的运转*/
   {
      for(arow=1;arow<=M.mu;++arow)
      {
  for(k=1;k<=M.mu;k++)
  ctemp[k]=0;/*将累积器清零*/
  Q->rpos[arow]=Q->tu+1;
  if(arow<M.mu) tp=M.rpos[arow+1];
  else {tp=M.tu+1;}
/*对日前进中每一个非零元找到对应元在N中的地点*/
  for(p=M.rpos[arow];p<tp;++p)
  {
     brow=M.data[p].j;
     if(brow<N.mu)  t=N.rpos[brow+1];
     else {t=N.tu+1;}
     for(q=N.rpos[brow];q<t;++q)
     {
        ccol=N.data[q].j;/*乘积元在Q中的列号*/
        ctemp[ccol]+=M.data[p].e*N.data[q].e;
     }
  }/*求得Q中第arow行的非零元*/
  for(ccol=1;ccol<=Q->nu;++ccol)
  if(ctemp[ccol])
  {  /*减掉存款和储蓄该行的非零元*/
     if(++Q->tu>MAX)
printf(“error”);/*若Q中的非零元的个数超过最大规模输出错误的音信*/
     Q->data[Q->tu].i=arow;
     Q->data[Q->tu].j=ccol;
     Q->data[Q->tu].e=ctemp[ccol];
         }
      }
   }
/*求出Q中每一行非零元在Q.data中之处*/
 for(t=1;t<=(*Q).tu;t++)
     ++num[(*Q).data[t].i];
   (*Q).rpos[1]=1;
   for(t=2;t<=(*Q).mu;t++)
   (*Q).rpos[t]=(*Q).rpos[t-1]+num[t-1];
}

      {

/*疏散矩阵的起首化函数*/
void InitMatrix(Matrix *W)
{ int i,p,num[MAX],rpos[MAX],r;
  printf(“please input the number of row,col and fei ling
yuan:n”);/*输入矩阵的行数,列数非零元的个数*/
  scanf(“%d,%d,%d”,&W->mu,&W->nu,&W->tu);
  printf(“please input the data:n”);
  for(i=1;i<=W->tu;i++)/*输入矩阵的行号,列号和非零元的数值*/
   
scanf(“%d,%d,%d”,&W->data[i].i,&W->data[i].j,&W->data[i].e);
/*求矩阵W各行第一个非零元在W.data中之处*/
  for(r=1;r<=W->mu;r++)
     num[r]=0;/*起头化W每一行的非零元的个数为0*/
  for(p=1;p<=W->tu;p++)
     num[W->data[p].i]=num[W->data[p].i]+1;
   W->rpos[1]=1;
  for(r=2;r<=W->mu+1;r++)
     W->rpos[r]=W->rpos[r-1]+num[r-1];
}
永利澳门游戏网址304,/*将A转置为B的函数*/
void fasttrans(Matrix A,Matrix *B)
{
   int col,cpot[MAX],num[MAX],t,p,q;
  /*初阶化矩阵B*/
   (*B).mu=A.nu;
   (*B).nu=A.mu;
   (*B).tu=A.tu;
   if(B->tu)
   {
      for(col=0;col<A.nu;++col)
        num[col]=0;/*起头化每一列非零元的个数*/
      for(t=1;t<=A.tu;++t)
      ++num[A.data[t].j];/*计量每一列非零元的个数*/
      cpot[1]=1;
      for(col=2;col<=A.nu;++col)
        
cpot[col]=cpot[col-1]+num[col-1];/*算算矩阵A每一列第多少个非零元在B.data中的地点*/
     /*完毕对A中的每一个非零元进行转置*/
     for(p=1;p<=A.tu;++p)
      {
  col=A.data[p].j;
  q=cpot[col];
  (*B).data[q].i=A.data[p].j;
  (*B).data[q].j=A.data[p].i;
  (*B).data[q].e=A.data[p].e;
  ++cpot[col];
      }
   }
}

创建荒疏矩阵相应安慕希组的算法如下所示:

/* 矩阵的输出函数*/
void output(Matrix *P)
 {  int i,j,t,k=0;
      t=1;
    printf(” the array  is: n”);
    for(i=1;i<=P->mu;i++)
     {for(j=1;j<=P->nu;j++)
      {  if(P->data[t].i==i&&P->data[t].j==j)
    { printf(“%4d”,P->data[t].e);t++;}
            else printf(“%4d”,k);
       }
      printf(“n”);
    }
 }

     
if (array_a[i][j]!=0)

typedef struct
{
 int i,j;/*非零元的行下标和列下标*/
 int e;/*该非零元的数值*/
}Triple;

spmatrix a;

#include<stdio.h>
#define MAX 40 /*非零元个数的最大值*/

triple data[MAXSIZE+1];
/*data[0]用来寄放荒废矩阵行,列和非零元个数*/

void main( )
{ int i;
  Matrix A,B,C;/*定义Matrix类型的四个矩阵A,B,C*/
/*行使表达*/
  printf(“1 mult array,A*B=Cn”);
  printf(“2 transpose array,A->Bn”);
  printf(“3 exitn”);
 while(1)
  { printf(“please select item to operarting:”);
    scanf(“%d”,&i);
    switch(i)/*用switch语句完毕各类功效的转移*/
     { case 1:
InitMatrix(&A);output(&A);InitMatrix(&B);output(&B);MulMatrix(A,B,&C);output(&C);break;
       case 2:
InitMatrix(&A);output(&A);fasttrans(A,&B);output(&B);break;
       case 3: exit(0); break;
     }
  }
}

/*array_a是三个疏散矩阵,a是发出的相对应的长富组存储*/

int mu, nu, tu; /*疏落矩阵行、列和非零元的个数*/

     
a.data[0][1]=N;

{

{

elemtype v;

#define
MAXSIZE 1000 /*假使非零元个数的最大值是1000*/

for
(i=0;i<M;i++) /*按行优先顺序扫描array_a的元素,不为0者存入B中*/

发表评论

电子邮件地址不会被公开。 必填项已用*标注