| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 594 人关注过本帖
标题:稀疏矩阵,不知道哪错了,运行到"请输入相加:1、相减:2、相乘:3、退出:4"就 ...
只看楼主 加入收藏
weibingyi
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-15
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:3 
稀疏矩阵,不知道哪错了,运行到"请输入相加:1、相减:2、相乘:3、退出:4"就没有了。。求解答
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE   12500
//三元组结构
typedef struct
{
  int i,j;  //矩阵行下标和列下标
  int e;   //值
}Triple;
//矩阵结构
typedef struct
{
    Triple data[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].i);
      printf("\n");
      printf("第%d个非零元得列号:",i);
      scanf("%d",&M->data[i].j);
      printf("\n");
      printf("第个非零元的值:",i);
      scanf("%d",&M->data[i].e);
      p[M->data[i].i][M->data[i].j]=M->data[i].e;
  }
  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");
   
  }   
}










void  Add(matrix *M,matrix *T,matrix *G)
{
   G->mu=M->mu;
   G->nu=M->nu;
   G->tu=0;
   int g,m,t;
   int u,v;
   int p[8][8];
   g=m=t=1;
   int sum;
   for(u=1;u<=M->mu;u++)
    for(v=1;v<=T->nu;v++)
       p[u][v]=0;
   if(M->mu!=T->mu||M->nu!=T->nu)
   {
      printf("维数不等\n");
   }
while(m<=M->tu&&t<=T->tu)
{
  if(M->data[m].i==T->data[t].i)   //行下标相等时
  {
      if(M->data[m].j==T->data[t].j)
      {
         sum=M->data[m].e+T->data[t].e;
         if(sum!=0)
         {
             G->data[g].i=M->data[m].i;
             G->data[g].j=M->data[m].j;
             p[G->data[g].i][G->data[g].j]=sum;
             G->tu++;
             g++;
             m++;
             t++;
         }
         else   //矩阵相加为零时,不做存储操作
         {
             m++;
             t++;
         }
      }
  }
}
while(M->data[m].e!=0&&T->data[t].e==0)   //插入M的剩余元素
{
    G->data[g].i=M->data[m].i;
    G->data[g].j=M->data[m].j;
    p[G->data[g].i][G->data[g].j]=M->data[m].e;
    G->tu++;
    m++;
    g++;
}
while(T->data[t].e!=0&&M->data[m].e==0)  //插入T剩余的元素
{
   G->data[g].i=T->data[t].i;
   G->data[g].j=T->data[t].j;
   p[G->data[g].i][G->data[g].j]=T->data[t].e;
   G->tu++;
   t++;
   g++;
}
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");
   
  }   
}


void Jian(matrix *M,matrix *T,matrix *G)
{
  G->mu=M->mu;
  G->nu=M->nu;
  G->tu=0;
  int sum;
  int u,v;
  int p[8][8];
  int m,t,g;
  m=t=g=1;
for(u=1;u<=M->mu;u++)
  for(v=1;v<=T->nu;v++)
    p[u][v]=0  ;

if(M->mu!=T->mu||M->nu!=T->nu)
   {
      printf("维数不等\n");
   }
while(m<=M->tu&&t<=T->tu)
{
  if(M->data[m].i==T->data[t].i)   //行下标相等时
  {
      if(M->data[m].j==T->data[t].j)
      {
         sum=M->data[m].e-T->data[t].e;
         if(sum!=0)
         {
             G->data[g].i=M->data[m].i;
             G->data[g].j=M->data[m].j;
            
             p[G->data[g].i][G->data[g].j]=sum;
             G->tu++;
             g++;
             m++;
             t++;
         }
         else   //矩阵相减为零时,不做存储操作
         {
             m++;
             t++;
         }
      }
  }
}
while(M->data[m].e!=0&&T->data[t].e==0)   //插入M的剩余元素
{
    G->data[g].i=M->data[m].i;
    G->data[g].j=M->data[m].j;
    p[G->data[g].i][G->data[g].j]=M->data[m].e;
    G->tu++;
    m++;
    g++;
}
while(T->data[t].e!=0&&M->data[m].e==0)  //插入T剩余的元素
{
   G->data[g].i=T->data[t].i;
   G->data[g].j=T->data[t].j;
   p[G->data[g].i][G->data[g].j]=-(T->data[t].e);
   G->tu++;
   t++;
   g++;
}
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");
   
  }   


}

void Cheng(matrix *M,matrix *T,matrix *G)
{
   int k,w,q,x,mrow,trow,gcol;
   int tmp[MAXSIZE];  //累加器
   int num[MAXSIZE];   //记录矩阵的各行的第一个非零元的位置
   int m,t,g;
   m=t=g=1;
   w=1;
   int u,v;
   int p[8][8];
   for(u=1;u<=M->mu;u++)
    for(v=1;v<=T->nu;v++)
      p[u][v]=0  ;
   if(M->nu!=T->mu)
   {
       printf("这个矩阵不能相乘\n");
   }
G->mu=M->mu;
G->nu=T->nu;
G->tu=0;
if(M->tu*T->tu!=0)
{
  for(mrow=1;mrow<M->mu;mrow++)  //清零
  {
      num[mrow]=0;
  }
  for(w=1;w<=M->tu;w++)   //M中的非零个数
  {
      k=M->data[w].i;
      num[k]++;
  }
  M->rops[1]=1;  //第一行第一个非零元的位置在data[]的第一位
 for(mrow=2;mrow<=M->mu;mrow)
 {
     M->rops[mrow]=M->rops[mrow-1]+num[mrow-1];
 }
 printf("\n");
 printf("矩阵M\n");
 for(mrow=1;mrow<=M->mu;mrow++)
 {
     printf("第%d行的第一个非零元在data中的序号是(%d)\n",mrow,M->rops[mrow]);
 }
//记录矩阵T中各行非零元的个数
 for(trow=1;trow<T->mu;trow++)  //清零
 {
     num[trow]=0;
 }
 for(w=1;w<=T->tu;w++)     //T中的非零个数
 {
     k=T->data[w].i;
     num[k]++;
 }
T->rops[1]=1;    //第一行第一个非零元的位置在data的第一位
 for(trow=2;trow<=T->mu;trow++)
 {
   T->rops[trow]=T->rops[trow-1]+num[trow-1];
 }
 printf("\n");
 printf("矩阵T\n");
 for(trow=1;trow<=T->mu;trow++)
 {
  printf("第%d行的第一个非零元在data中的序号是(%d)\n",mrow,T->rops[mrow]);
 }
 for(mrow=1;mrow<=M->mu;mrow++)
 {
   for(k=1;k<=T->nu;k++)    //当前行个元素累加器清零
   {
       tmp[k]=0;
   }
   G->rops[mrow]=G->tu+1;   
   for(w=M->rops[mrow];w<M->rops[mrow+1];w++)   // 矩阵G各行的第一个非零元在data中的位置
   {
       trow=M->data[w].j;
       if(trow<T->mu)
       {
           x=T->rops[trow+1];
       }
       else
         x=T->tu+1;
       for(q=T->rops[trow];q<x;q++)
       {
           gcol=T->data[q].j;
           tmp[gcol]+=M->data[w].e*T->data[q].e;   //对应非零元累加
       }
   }
 for(gcol=1;gcol<=G->nu;gcol++)   //压缩存储
 {
   if(tmp[gcol])
   {
      G->data[G->tu+1].i=mrow;
      G->data[G->tu+1].j=gcol;
      p[G->data[G->tu+1].i][G->data[G->tu+1].j]=tmp[gcol];
      G->tu++;
   }
 }

 }
}

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 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",&(M->mu),(&M->nu));
   printf("非零元的个数:");
   scanf("%d",&(M->tu));
   Init(M);
   printf("\n");

   printf("请输入第二个矩阵的行数列数:");
   scanf("%d%d",&(T->mu),(&T->nu));
   printf("非零元的个数:");
   scanf("%d",&(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-15 11:45
独行wang
Rank: 1
等 级:新手上路
帖 子:6
专家分:8
注 册:2011-4-11
收藏
得分:5 
代码太多,你是在做矩阵的运算吗?我写了一矩阵的加法运算?需要不?
2011-04-15 12:37
weibingyi
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-4-15
收藏
得分:0 
回复 2楼 独行wang
有没有完整一点的。。。谢谢
2011-04-15 16:38
死不了的恨
Rank: 2
来 自:淮北
等 级:论坛游民
帖 子:16
专家分:54
注 册:2011-4-11
收藏
得分:5 
因为楼主的循环语句写错了。就拿Add()函数中的一个函数来说。
下面是楼主的源程序的一部分:
while(m<=M->tu&&t<=T->tu)
{
  if(M->data[m].i==T->data[t].i)   //行下标相等时
  {
      if(M->data[m].j==T->data[t].j)
      {
         sum=M->data[m].e-T->data[t].e;
         if(sum!=0)
         {
             G->data[g].i=M->data[m].i;
             G->data[g].j=M->data[m].j;
            
             p[G->data[g].i][G->data[g].j]=sum;
             G->tu++;
             g++;
             m++;
             t++;
         }
         else   //矩阵相减为零时,不做存储操作
         {
             m++;
             t++;
         }
      }
  }
楼主仔细看这个程序,如果M->data[m].i!=T->data[t].i,则i和m的值不会永远不会变,这个循环永远不能结束。
所以程序一直停留在运行循环的部分,不会向下执行。

天行鉴,君子以自强不息。
2011-04-16 17:08
快速回复:稀疏矩阵,不知道哪错了,运行到"请输入相加:1、相减:2、相乘:3、退出 ...
数据加载中...
 
   



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

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