回 帖 发 新 帖 刷新版面

主题:怎么样用三元组表实现两个稀疏矩阵的加法

帮帮忙!!谢谢

回复列表 (共8个回复)

沙发

将i,j相等项的值相加即可,在重建一个三元组表,i,j不变,值为两者之和,代码就留给你自己实现了。

板凳

我要的就是代码 
那个思路我也知道

3 楼

#define MAXSIZE 500
typedef struct
{
 int i,j;
 int e;
}TRIPLE;
typedef struct
{
 TRIPLE data[MAXSIZE+1];
 int mu,nu,tu;
}TSMATRIX;
void TSMatrix_Add(TSMatrix A,TSMatrix B,TSMatrix &C)

  C.mu=A.mu;C.nu=A.nu;C.tu=0; 
  pa=1;pb=1;pc=1; 
  for(x=1;x<=A.mu;x++)
  { 
    while(A.data[pa].i<x) pa++; 
    while(B.data[pb].i<x) pb++; 
    while(A.data[pa].i==x&&B.data[pb].i==x) 
    { 
      if(A.data[pa].j==B.data[pb].j) 

      { 
        ce=A.data[pa].e+B.data[pb].e; 
        if(ce)
        { 
          C.data[pc].i=x; 
          C.data[pc].j=A.data[pa].j; 
          C.data[pc].e=ce; 
          pa++;pb++;pc++; 
        } 
      }
      else if(A.data[pa].j>B.data[pb].j) 
      { 
        C.data[pc].i=x; 
        C.data[pc].j=B.data[pb].j; 
        C.data[pc].e=B.data[pb].e; 
        pb++;pc++; 
      } 
      else 
      { 
        C.data[pc].i=x; 
        C.data[pc].j=A.data[pa].j; 
        C.data[pc].e=A.data[pa].e 
        C.data[pc].e=A.data[pa].e 
        pa++;pc++; 
      } 
    }
    while(A.data[pa]==x) 
    { 
      C.data[pc].i=x; 
      C.data[pc].j=A.data[pa].j; 
      C.data[pc].e=A.data[pa].e 
      pa++;pc++; 
    } 
    while(B.data[pb]==x) 
    { 
      C.data[pc].i=x; 
      C.data[pc].j=B.data[pb].j; 
      C.data[pc].e=B.data[pb].e; 
      pb++;pc++; 
    } 
  }
  C.tu=pc; 
}

4 楼

请问一下 主函数怎么写啊
才能在tc中运行

5 楼

自己顶一下
没有人知道吗

6 楼

这个我也会啊
我也试过了
好像不行耶
有没有人试过啊?
我好久没编过程序
真烦啊

有人能早点回啊

7 楼


#include "Stdio.h"
#include "Conio.h"

# define MAXSIZE 10    /*假设非零元个数的最大值为10*/
# define MAXRC 10

struct Triple
{
   int i,j;   /*该非零元的行下标和列下标*/
   int e;
};
struct TSMtrix
{
   struct Triple data[MAXSIZE+1];   /*非零元三元组表,data[0]未用*/
   int rpos[MAXRC+1];    /*各行第一个非零元的位置表*/
   int cpos[MAXRC+1];    /*各列第一个非零元的位置表*/
   int num[MAXRC+1];     /*各列非零元的个数*/
   int mu,nu,tu;   /*矩阵的行数、列数和非零元个数*/
};

CreateMtrix(struct TSMtrix *M)
{  /*创建一个稀疏矩阵*/
   int i,elem,col,row,mu,nu,tu;

   printf("please input matrix col,row,unzeroed numbers:\n");
   scanf("%d%d%d",&mu,&nu,&tu);
   M->mu=mu;
   M->nu=nu;
   M->tu=tu;

   for (i=1;i<=tu;i++)
   {
      printf("please input element col,row,value:\n");
      scanf("%d%d%d",&col,&row,&elem);

      if ( mu<0 || nu<0 || mu>M->mu || nu>M->nu)
      {
          printf("error!");
          i--;
      }
      else
      {
          M->data[i].i=col;
          M->data[i].j=row;
          M->data[i].e=elem;
      }

   }

}

ShowMtrix(struct TSMtrix M)
{  /*打印出矩阵*/
   int i=1,j=1,dir=1;
   printf("The matrix is:\n");

   for (i=1;i<=M.mu;i++)
   {
      for (j=1;j<=M.nu;j++)
      {
         if (M.data[dir].i==i && M.data[dir].j==j)    /*存在非零元*/
         {
             printf("%d   ",M.data[dir].e);
             dir++;
         }
         else
             printf("0   ");
      }
      printf("\n");
   }
}

FastTransposeSMtrix(struct TSMtrix M,struct TSMtrix *T)
{  /*矩阵的快速转置*/
   int t=1,p=1,q,col=M.nu;

   T->mu=M.mu;
   T->nu=M.nu;
   T->tu=M.tu;

   if (T->tu)
   {
       for (col=1;col<=M.nu;col++)
            M.num[col]=0;
       for (t=1;t<=M.nu;t++)
            ++M.num[M.data[t].j];
       M.cpos[1]=1;       /*找到M中cpos的位置*/

       for (col=2;col<=M.nu;col++)
            M.cpos[col]=M.cpos[col-1]+M.num[col-1];
       for (p=1;p<=M.tu;p++)
       {
            col=M.data[p].j;
            q=M.cpos[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;
            ++M.cpos[col];
       }
    }
}

8 楼

MultSMatrix(struct TSMtrix M,struct TSMtrix N,struct TSMtrix *Q)
{  /*稀疏矩阵相乘*/
   int i,arow,brow,ccol,t,temp,p,q;
   int ctemp[MAXRC+1]={0};

   if (M.nu!=N.mu)
       printf("Multiply error!");

   Q->mu=M.mu;
   Q->nu=N.nu;
   Q->tu=0;        /*Q初始化*/

 /*---------------查询M中rpos的位置------------------*/
   for (i=1;i<=M.mu;i++)
        M.num[i]=0;
   for (t=1;t<=M.tu;t++)
        ++M.num[M.data[t].i];
   M.rpos[1]=1;

   for (i=2;i<=M.mu;i++)
        M.rpos[i]=M.rpos[i-1]+M.num[i-1];

 /*---------------查询N中rpos的位置------------------*/
   for (i=1;i<=N.mu;i++)
        N.num[i]=0;
   for (t=1;t<=N.tu;t++)
        ++N.num[N.data[t].i];
   N.rpos[1]=1;

   for (i=2;i<=N.mu;i++)
        N.rpos[i]=N.rpos[i-1]+N.num[i-1];

 /*---------------矩阵的相乘------------------*/
   if (M.tu*N.tu!=0)     /*Q为非零矩阵*/
   {
       for (arow=1;arow<=M.mu;arow++)
       {
           for (i=0;i<=N.nu;i++)   /*处理M中的每一行*/
                ctemp[i]=0;       /*累加器ctemp每次都要清零*/

           Q->rpos[arow]=Q->tu+1;

           if (arow<M.mu)
               temp=M.rpos[arow+1];
           else
               temp=M.tu+1;

           for (p=M.rpos[arow];p<temp;p++)    /*对当前行中每一个非零元*/
           {
               brow=M.data[p].j;           /*找到对应元在N中的行号*/

               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中第crow( =arow)行的非零元*/
           for (ccol=1;ccol<=Q->nu;ccol++)       /*压缩存储该行非零元*/

              if (ctemp[ccol])
              {
                  if ( (++Q->tu) > MAXSIZE )
                       printf("error!");

                  Q->data[Q->tu].i=arow;
                  Q->data[Q->tu].j=ccol;
                  Q->data[Q->tu].e=ctemp[ccol];
              }
        }
    }
    else
        printf("There's no unzeroed element!");
}

main()
{
  struct TSMtrix M;
  struct TSMtrix T;
  struct TSMtrix Q;
  struct TSMtrix N;

  CreateMtrix(&M);
  ShowMtrix(M);
  printf("\n");
  CreateMtrix(&T);
  ShowMtrix(T);

  MultSMatrix(M,T,&Q);
  ShowMtrix(Q);
  FastTransposeSMtrix(Q,&N);
  ShowMtrix(N);
  getch();

}[

我来回复

您尚未登录,请登录后再回复。点此登录或注册