加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

稀疏矩阵的加减乘除运算c语言程序

(2010-11-01 15:24:11)
标签:

乘积

c语言

零矩阵

加减乘除

累加器

it

分类: c和c 知识和代码

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR    -1
#define OK     1
#define MAXSIZE    100
#define MAXRC    100
typedef int ElemType;

typedef struct {
 int i, j;
 ElemType e;
}Triple;

typedef struct {
 Triple data[MAXSIZE+1];
 int rpos[MAXRC+1];   //各行第一个非零元的位置表
 int mu, nu, tu;
}TSMatrix;

//初始化稀疏矩阵M
int InitSMatrix(TSMatrix &M) {
 TSMatrix *p;
 p=(TSMatrix *)malloc(sizeof(TSMatrix));
 if(!p)
  return ERROR;
 M=*p;
 M.mu=0; M.nu=0; M.tu=0;
 for(int l=0; l<=MAXRC+1; l++)
  M.rpos[l]=0;
 return OK;
}

//创建稀疏矩阵M
int CreateSMatrix(TSMatrix &M) {
 InitSMatrix(M);
 printf("Please input the TSMatrix's mu, nu, tu:\n");
 scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
 printf("\nInput %d elements:\n",M.tu);
 for(int i=1; i<=M.tu; i++)
  scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
 return OK;
}

//销毁稀疏矩阵M
void DestroySMatrix(TSMatrix &M) {
 M.nu=0; M.mu=0; M.tu=0;
}

//输出稀疏矩阵M
int PrintSMatrix(TSMatrix M) {
 if(M.tu<=0) return ERROR;
 int p=1;
 for(int a=1; a<=M.mu; a++) {
  for(int b=1; b<=M.nu; b++) {
   if(p<=M.tu && M.data[p].i==a && M.data[p].j==b) {
    printf("%d ",M.data[p].e);
    p++;
   }
   else
    printf("0 ");
  }
  printf("\n");    //输出每一行数组后换行
 }
 //printf("Input any key to the menu.\n");
 getch();
 return OK;
}

 

//求稀疏矩阵的转置
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T) {
 int col, t, p, q;
 int num[100], cpot[100];
 if(M.tu<=0 || M.mu<=0 || M.nu<=0)
  return ERROR;
 //T=(TSMatrix *)malloc(sizeof(TSMatrix));
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 if(T.tu) {
  for(col=1; col<=M.nu; ++col) num[col]=0;
  for(t=1; t<=M.tu; ++t) ++num[M.data[t].j]; //求M中每一列含非零元个数
  cpot[1]=1;
  //求第col列中第一个非零元在b.data中的序号
  for(col=2; col<=M.nu; ++col) cpot[col]=cpot[col-1]+num[col-1];
  for(p=1; p<=M.nu; ++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];
  }
 }
 printf("FastTransposeSMatrix success!\nThe FastTransposeSMatrix is:\n");
 PrintSMatrix(T);
 return OK;
}

void GetRpos(TSMatrix &M) {
  int row,t,num[MAXSIZE];
  for (row=1;row<=MAXSIZE;++row) num[row]=0; 
  for (t=1;t<=M.tu;++t) ++num[M.data[t].i];
  M.rpos[1]=1;
  for (row=2;row<=M.mu;++row) M.rpos[row]=M.rpos[row-1]+num[row-1];
}


//求稀疏矩阵的乘积
int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) {
 //求矩阵乘积Q=M X N,采用行逻辑链接存储表示
 if(M.nu!=N.mu)
  return ERROR;
 Q.mu=M.mu; Q.nu=N.nu; Q.tu=0;
 int arow, brow, tp, p, q, t, ccol, k=1;
 GetRpos(M); GetRpos(N);
 if(M.tu*N.tu!=0) {     //Q是非零矩阵
  for(arow=1; arow<=M.mu; ++arow) { //处理M的每一行
   int ctemp[50]={0};    //当前行各元素累加器清零
   Q.rpos[arow]=Q.tu+1;
   if(arow<M.mu)
    tp=M.rpos[arow+1];
   else { tp=M.tu+1; }
   for(p=M.rpos[arow]; p<tp; ++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) return ERROR;
     //Q.data[Q.tu]=(arow,ccol,ctemp[ccol]);
     Q.data[Q.tu].i=arow;
     Q.data[Q.tu].j=ccol;
     Q.data[Q.tu].e=ctemp[ccol];
    }
  }
 }
 PrintSMatrix(Q);
 getch();
 return OK;
}

int AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) {
 if(M.mu!=N.mu||M.nu!=N.nu)
        return ERROR;
    Q.mu=M.mu;
    Q.nu=M.nu;
    Q.tu=0;
    int x=0,y=0;
    for(int i=1;i<=Q.mu;i++){
     for(int j=1;j<=Q.nu;j++){
      for(int p=1;p<=M.tu;p++){
       if((i==M.data[p].i)&&(j==M.data[p].j)){
              x=M.data[p].e;
              break;
                }
     else x=0; 
         }//for p
         for(int q=1;q<=N.tu;q++){
       if((i==N.data[q].i)&&(j==N.data[q].j)){
              y=N.data[q].e;
              break;
                }
     else y=0;   
         }//for q
         if((x+y)!=0){
             Q.data[Q.tu+1].i=i;
             Q.data[Q.tu+1].j=j;
             Q.data[Q.tu+1].e=x+y;
             Q.tu++;
       }//if
     }//for j
    }//for i 
 PrintSMatrix(Q);
return OK;
}

 

void menu() {
 printf("\t************************************************************\n");
 printf("\t         菜单选项\n");
 printf("\t************************************************************\n\n\n\n");
 printf("\t\t\t1. CreateSMatrix.\n");
 printf("\t\t\t2. DestroySMatrix.\n");
 printf("\t\t\t3. PrintSMatrix.\n");
 printf("\t\t\t4. AddSMatrix.\n");
 printf("\t\t\t5. MultSMatrix.\n");
 printf("\t\t\t6. FastTransposeSMatrix.\n");
 printf("\t\t\t0. exit.\n\n");
 printf("\t\t\tInput your choose:\n\t\t\t");
}

void main(){
 int swh;
 TSMatrix M, N, Q, T;
 do {
  menu();
  scanf("%d", &swh);
  switch(swh) {
  case(1):
   InitSMatrix(M);
   CreateSMatrix(M);
   break;
  case(2):
   DestroySMatrix(M);
   break;
  case(3):
   PrintSMatrix(M);
   break;
  case(4):
   InitSMatrix(Q);
   printf("Input M:\n");
   CreateSMatrix(M);
   printf("Input N:\n");
         CreateSMatrix(N);
   AddSMatrix(M,N,Q);
   break;
  case(5):
   InitSMatrix(Q);
   printf("Input M:\n");
   CreateSMatrix(M);
   printf("Input N:\n");
         CreateSMatrix(N);
   MultSMatrix(M,N,Q);
   break;
  case(6):
   InitSMatrix(T);
   FastTransposeSMatrix(M,T);
   break;
  case(0):
   exit(0);
  default:
   menu();
  }
  
 }while(1);
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有