| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 993 人关注过本帖
标题:关于稀疏矩阵加减乘
取消只看楼主 加入收藏
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
关于稀疏矩阵加减乘
我这个代码加减都可以了,就是乘法出不来,看了好久,实在不会,求高手指教。


#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
//三元组结构
typedef struct
{
  int r,c;  //矩阵行下标和列下标
  int v;   //值
}Triple;
//矩阵结构
typedef struct
{
    Triple data[MAXSIZE];
    int num[MAXSIZE];//存放各行非零元个数
    int rops[MAXSIZE+1];    //存放各行第一个非零元在矩阵中的位置
    int mu,nu,tu;    //矩阵的行数、列数、非零元个数
}matrix;

//输入矩阵
void Init(matrix *M)
{
   int i;
   int u,v;
   int p[8][8];
   if(M->mu<1||M->nu<1||M->tu>M->mu*M->nu)
   {
       printf("出错\n");
   }
   for(u=1;u<=M->mu;u++)
    for(v=1;v<=M->nu;v++)
       p[u][v]=0;
  for(i=1;i<=M->tu;i++)
  {
      printf("第%d个非零元的行号:",i);
      scanf("%d",&M->data[i].r);
      printf("\n");
      printf("第%d个非零元得列号:",i);
      scanf("%d",&M->data[i].c);
      printf("\n");
      printf("第个非零元的值:",i);
      scanf("%d",&M->data[i].v);
      p[M->data[i].r][M->data[i].c]=M->data[i].v;
  }
  printf("\n");
  printf("您创建的矩阵如下:\n");
  for(u=1;u<=M->mu;u++)
  {for(v=1;v<=M->nu;v++)
    { printf("%d ",p[u][v]);}
    printf("\n");
   
  }   
}

int Add(matrix *M,matrix *T,matrix *G)
{  int sum;
   int i = 1, j = 1, k = 1;    //i, j, k分别用以保存A、B、C非零元素个数
   int u,v;
   int p[8][8];
   for(u=1;u<=M->mu;u++)
    for(v=1;v<=M->nu;v++)
       p[u][v]=0;
  if (M->mu !=T->mu || M->mu != T->nu)
    {
        printf( "两个稀疏矩阵的大小不等,不能相加!\n");
        return 0;
    }
  
    if (M->mu ==T->mu && M->nu ==T->nu)
    {
        while (i<=M->tu && j<=T->tu)
        {
            if (M->data[i].r==T->data[j].r)
            {
                if (M->data[i].c <T->data[j].c)
                {
                    G->data[k].r=M->data[i].r;
                    G->data[k].c=M->data[i].c;
                    p[G->data[k].r][G->data[k].c]=M->data[i].v;
                    k++;
                    i++;
                }
                else if (M->data[i].c > T->data[j].c)
                {
                    G->data[k].r=T->data[j].r;
                    G->data[k].c=T->data[j].c;
                    p[G->data[k].r][G->data[k].c]=T->data[j].v;
                    k++;
                    j++;
                }
                else
                {
                    sum=M->data[i].v+T->data[j].v;
                    if (sum!= 0)
                    {
                        G->data[k].r=M->data[i].r;
                        G->data[k].c=M->data[i].c;
                        p[G->data[k].r][G->data[k].c]=sum;
                        k++;
                    }
                    i++;
                    j++;
                }
            }//end_if
            else if (M->data[i].r < T->data[j].r)
            {
                G->data[k].r=M->data[i].r;
                G->data[k].c=M->data[i].c;
                p[G->data[k].r][G->data[k].c]=M->data[i].v;
                k++;
                i++;
            }
            else
            {
                G->data[k].r=T->data[j].r;
                G->data[k].c=T->data[j].c;
                p[G->data[k].r][G->data[k].c]=T->data[j].v;
                k++;
                j++;
            }
            //把剩余部分元素存入C中
            if (i>M->tu&&j<=T->tu)
            {
                for (; j <= T->tu; j++)
                {
                    G->data[k].r = T->data[j].r;
                    G->data[k].c = T->data[j].c;
                    p[G->data[k].r][G->data[k].c] = T->data[j].v;
                    k++;
                }
            }
            if (i <= M->tu && j > T->tu)
            {
                for (; i <= M->tu; i++)
                {
                    G->data[k].r = M->data[i].r;
                    G->data[k].c = M->data[i].c;
                    p[G->data[k].r][G->data[k].c] = M->data[i].v;
                    k++;
                }
            }
        }//end_while
        G->mu = M->mu;
        G->nu = M->nu;
        G->tu = k-1;
       printf("输出两个稀疏矩阵的和: \n");
       for(u=1;u<=M->mu;u++)
        { for(v=1;v<=M->nu;v++)
      { printf("%d ",p[u][v]);}
      printf("\n");
   
        }   
        return 1;
    }//end_if
    else
        return 0;
}

int Jian(matrix *M,matrix *T,matrix *G)

{  int sum;
   int i = 1, j = 1, k = 1;    //i, j, k分别用以保存A、B、C非零元素个数
 int u,v;
   int p[8][8];
   for(u=1;u<=M->mu;u++)
    for(v=1;v<=M->nu;v++)
       p[u][v]=0;
  if (M->mu !=T->mu || M->mu != T->nu)
    {
        printf( "两个稀疏矩阵的大小不等,不能相减!\n");
        return 0;
    }
  
    if (M->mu ==T->mu && M->nu ==T->nu)
    {
        while (i<=M->tu && j<=T->tu)
        {
            if (M->data[i].r==T->data[j].r)
            {
                if (M->data[i].c <T->data[j].c)
                {
                    G->data[k].r=M->data[i].r;
                    G->data[k].c=M->data[i].c;
                    p[G->data[k].r][G->data[k].c]=M->data[i].v;
                    k++;
                    i++;
                }
                else if (M->data[i].c > T->data[j].c)
                {
                    G->data[k].r=T->data[j].r;
                    G->data[k].c=T->data[j].c;
                    p[G->data[k].r][G->data[k].c]=T->data[j].v;
                    k++;
                    j++;
                }
                else
                {
                    sum=M->data[i].v-T->data[j].v;
                    if (sum!= 0)
                    {
                        G->data[k].r=M->data[i].r;
                        G->data[k].c=M->data[i].c;
                        p[G->data[k].r][G->data[k].c]=sum;
                        k++;
                    }
                    i++;
                    j++;
                }
            }//end_if
            else if (M->data[i].r < T->data[j].r)
            {
                G->data[k].r=M->data[i].r;
                G->data[k].c=M->data[i].c;
                p[G->data[k].r][G->data[k].c]=M->data[i].v;
                k++;
                i++;
            }
            else
            {
                G->data[k].r=T->data[j].r;
                G->data[k].c=T->data[j].c;
                p[G->data[k].r][G->data[k].c]=T->data[j].v;
                k++;
                j++;
            }
            //把剩余部分元素存入C中
            if (i>M->tu&&j<=T->tu)
            {
                for (; j <= T->tu; j++)
                {
                    G->data[k].r = T->data[j].r;
                    G->data[k].c = T->data[j].c;
                    p[G->data[k].r][G->data[k].c] = -T->data[j].v;
                    k++;
                }
            }
            if (i <= M->tu && j > T->tu)
            {
                for (; i <= M->tu; i++)
                {
                    G->data[k].r = M->data[i].r;
                    G->data[k].c = M->data[i].c;
                    p[G->data[k].r][G->data[k].c] = M->data[i].v;
                    k++;
                }
            }
        }//end_while
        G->mu = M->mu;
        G->nu = M->nu;
        G->tu = k-1;
        printf("输出两个稀疏矩阵的差: \n");
       for(u=1;u<=M->mu;u++)
       {  for(v=1;v<=M->nu;v++)
       { printf("%d ",p[u][v]);}
        printf("\n");
       }   
        return 1;
    }//end_if
    else
        return 0;
}
//输出矩阵,按标准格式输出





int Cheng(matrix *M,matrix *T,matrix *G)
{ int u,v,w,k;
  int p1[MAXSIZE+1][MAXSIZE+1];
  for(u=1;u<=M->mu;u++)
  {for(v=1;v<=M->nu;v++)
       p1[u][v]=0;
  }
  if (M->nu!= T->mu)
    {
       printf("不能相乘\n");
        return 1;
    }
    //Q的初始化
    G->mu=M->mu;
    G->nu=T->nu;
    G->tu=0;
    int mrow, nrow, p, q, t, tp, qcol;
    int ctemp[MAXSIZE+1];
    for(mrow=1;mrow<M->mu;mrow++)  //清零
  {
      M->num[mrow]=0;
  }
  for(w=1;w<=M->tu;w++)   //M中的非零个数
  {
      k=M->data[w].r;
      M->num[k]++;
  }
  M->rops[1]=1;  //第一行第一个非零元的位置在data[]的第一位
 for(mrow=2;mrow<=M->mu;mrow)
 {
     M->rops[mrow]=M->rops[mrow-1]+M->num[mrow-1];
 }
 
//记录矩阵T中各行非零元的个数
 for(nrow=1;nrow<T->mu;nrow++)  //清零
 {
     T->num[nrow]=0;
 }
 for(w=1;w<=T->tu;w++)     //T中的非零个数
 {
     k=T->data[w].r;
     T->num[k]++;
 }
T->rops[1]=1;    //第一行第一个非零元的位置在data的第一位
 for(nrow=2;nrow<=T->mu;nrow++)
 {
   T->rops[nrow]=T->rops[nrow-1]+T->num[nrow-1];
 }
 
    //辅助数组
    //如果Q是非零矩阵
    if (M->tu*T->tu!=0)
    {
        for (mrow=1; mrow<= M->mu;++mrow)
        {
            //当前行各元素累加器清零
            for(int x=1;x<=T->nu;x++)
            {ctemp[x];}
            //end_x
            //当前行的首个非零元素在三元组中的位置为此行前所有非0元素加1
            G->rops[mrow]=G->tu+1;
            if (mrow<M->mu)
            {
                tp=M->rops[mrow+1];
            }
            else
                tp=M->tu+1;
            for (p=M->rops[mrow]; p<tp;++p)        //对当前行的每个非零元素操作
            {
                nrow=M->data[p].c;        //在N中找到与M操作元素的c值相等的行值r
                if (nrow<T->mu)
                {
                    t = T->rops[nrow+1];
                }
                else
                    t = T->tu+1;
                //对找出的行的每个非零元素进行操作
                for (q = T->rops[nrow];q<t;++q)
                {
                    qcol = T->data[q].c;
                    //将乘得到的对应值放在相应元素的累加器里面
                    ctemp[qcol] += M->data[p].v*T->data[q].v;
                }
            }//p_end_for
            
            //对已经求出的累加器中的值压缩到Q中
            for (qcol=1;qcol<=T->nu;qcol++)
            {
                    if (++T->tu>MAXSIZE)
                    {
                        printf("错误\n");
                          return 1;
                    }
                if (ctemp[qcol])
                {
                     
                    G->data[G->tu].r = mrow;
                    G->data[G->tu].c = qcol;
                    p1[G->data[G->tu].r][G->data[G->tu].c] = ctemp[qcol];
                    
                  
                }
            }//qcol_end_for
        }//arow_end_for
    }//end_if
    printf("两矩阵相乘的结果为:\n");

   for(u=1;u<=M->mu;u++)
    {  for(v=1;v<=M->nu;v++)
    {printf("%d ",p1[u][v]);}
    printf("\n");
    }

  return 0;  
}



int main()
{
  matrix *M=(matrix*)malloc(sizeof(matrix));
  matrix *T=(matrix*)malloc(sizeof(matrix));
  matrix *G=(matrix*)malloc(sizeof(matrix));
  int tag=1;
  int n;
   printf("请输入第一个矩阵的行数和列数及非零元的个数:");
   scanf("%d%d%d",&(M->mu),(&M->nu),(&M->tu));
   
   Init(M);
   printf("\n");

   printf("请输入第一个矩阵的行数和列数及非零元的个数:");
   scanf("%d%d%d",&(T->mu),(&T->nu),(&T->tu));
   Init(T);
   printf("\n");

  while(tag)
  {
      printf("请输入相加(1)、相减(2)、相乘(3)、退出(4)");
      printf("\n");
      scanf("%d",&n);
      switch(n)
      {
        case 1:Add(M,T,G);break;
        case 2:Jian(M,T,G);break;
        case 3:Cheng(M,T,G);break;
        case 4:tag=0;
      }
  }
  return 0;
}
搜索更多相关主题的帖子: 三元 
2011-04-17 19:32
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
收藏
得分:0 
回复 4楼 寒风中的细雨



       非常感谢。。。。。。。。。。
2011-04-19 22:25
营养书
Rank: 2
等 级:论坛游民
帖 子:25
专家分:29
注 册:2011-4-17
收藏
得分:0 
if (M->m_rops[index] == DIM_COL)
                {
                    M->m_rops[index] = M->m_data[index].col;//标记第一个非零元数列好
                }
                else
                {
                    if (M->m_rops[index] > M->m_data[index].col)
                    {
                        M->m_rops[index] = M->m_data[index].col;//更新第一非零元数的位置
                    }
                }

问一下这个语句是什么意思?为什么要开始把M->m_rops[index]赋值为DIM_COL??
2011-04-21 22:43
快速回复:关于稀疏矩阵加减乘
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019084 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved