logo资料库

稀疏矩阵的相关操作.docx

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
#include #define MAXSIZE 12500//假设非零元个数的最大值为 12500 #define MAXRC 1000 typedef struct { //定义三元组 int r,c;//该非零元的行下标和列下标 int e;//该非零元的值 }Triple; typedef struct { Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用 int rpos[MAXRC+1]; int rows,cols,num;//矩阵的行数、列数和非零元个数 mu,nu,tu }TSMatrix; int prepare();//输入界面以及选择运算函数 int Read_data(TSMatrix *M);//读取矩阵并转换为三元组的函数 int TransposeSMatrix(TSMatrix M, TSMatrix *T);//矩阵的转置 int PlusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H);//矩阵的相加 int MinusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H);//矩阵的相减 int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q);//矩阵的相乘 int print(TSMatrix T);//打印矩阵函数 int compare(int , int , int , int);//判断矩阵能否相加、相减、相乘的函数 int print(TSMatrix M);//打印矩阵函数 int main()//主函数 { char ch,count; TSMatrix a1,a2,b; count = 0; while(1) { prepare(); ch = getchar(); printf("%c\n",ch); switch(ch) { case '-': //进行减法运算的模块选择 { printf("请输入第一个矩阵\n"); Read_data(&a1);
printf("请输入第二个矩阵\n"); Read_data(&a2); ch = getchar(); MinusSMatrix(a1, a2, &b); printf("两个矩阵相减的结果为:\n"); print(b); break; } case '+'://进行加法运算的模块选择 { } printf("请输入第一个矩阵\n"); Read_data(&a1); printf("请输入第二个矩阵\n"); Read_data(&a2); ch = getchar(); PlusSMatrix(a1, a2, &b); printf("两个矩阵相加的结果为:\n"); print(b); break; case '*'://进行乘法运算的模块选择 { } printf("请输入第一个矩阵\n"); Read_data(&a1); printf("请输入第二个矩阵\n"); Read_data(&a2); ch = getchar(); MultSMatrix(a1, a2, &b); printf("两个矩阵相乘的结果为:\n"); print(b); break; case 't'://进行转置运算的模块选择 { } printf("请输入您要转置的矩阵\n"); Read_data(&a1); ch = getchar(); TransposeSMatrix(a1, &b); printf("转置后的结果为:\n"); print(b); break; default :printf("输入错误,请重新输入:\n");break;//选择错误 }
count++; } return 0; } int Read_data(TSMatrix *M)//读取矩阵并转换为三元组的函数 { int k1,k2,k; int l,is; l = 0; M->num = 0; printf("请输入矩阵的行数和列数 : "); scanf("%d%d",&M->rows,&M->cols); for(k1=1;k1<=M->rows;k1++) { is = 0; for(k2=1; k2<=M->cols; k2++) { scanf("%d", &k); if(k != 0) { l++; M->data[l].r = k1; M->data[l].c = k2; M->data[l].e = k; if(is == 0 ) { M->rpos[k1] = l; is++; } } } } M->num = l; return 0; } int TransposeSMatrix(TSMatrix M, TSMatrix *T)//矩阵的转置 { int t,col,p,q; int a[MAXRC]; int cpot[10000]; T->rows = M.cols; T->cols = M.rows; T->num = M.num; if(T->num)
{ for(col = 1; col<=M.cols; ++col) a[col] = 0; for(t=1; t<=M.num; t++) a[M.data[t].c]++; cpot[1] = 1; //求第 col 列中的第一个非零元素在 b.data 中的序号 for(col=2; col<=M.cols; ++col) {cpot[col] = cpot[col-1] + a[col-1];} for(p=1; p<=M.num;++p) { col = M.data[p].c; q= cpot[col]; T->data[q].r = M.data[p].c; T->data[q].c = M.data[p].r; T->data[q].e = M.data[p].e; ++cpot[col]; } } return 0; } int PlusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H)//矩阵的相加 { int k1, k2,is; if(M.rows != N.rows || M.cols != N.cols) { printf("对不起,这两个矩阵不能进行相加\n"); return 0; } H->rows = M.rows; H->cols = M.cols; H->num = 0; k1 = k2 = 1; while( k1 <= M.num && k2 <= N.num) { = compare(M.data[k1].r, M.data[k1].c, N.data[k2].r, N.data[k2].c); is if(is == -1) { H->num++; H->data[H->num].r = M.data[k1].r; H->data[H->num].c = M.data[k1].c; H->data[H->num].e = M.data[k1].e; k1++; } else if(is == 1) { H->num++; H->data[H->num].r = N.data[k2].r; H->data[H->num].c = N.data[k2].c; H->data[H->num].e = N.data[k2].e;
k2++; } else { if( M.data[k1].e + N.data[k2].e) { H->num++; H->data[H->num].r = M.data[k1].r; H->data[H->num].c = M.data[k1].c; H->data[H->num].e = M.data[k1].e + N.data[k2].e; } k1++; k2++; } } if(k1 <= M.num) { } else { H->num++; H->data[H->num].r = M.data[k1].r; H->data[H->num].c = M.data[k1].c; H->data[H->num].e = M.data[k1].e; k1++; H->num++; H->data[H->num].r = N.data[k2].r; H->data[H->num].c = N.data[k2].c; H->data[H->num].e = N.data[k2].e; k2++; } return 1; } int MinusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H)//矩阵的相减 { int k1, k2,is; if(M.rows != N.rows || M.cols != N.cols) { printf("对不起,这两个矩阵不能进行相减\n"); return 0; } H->rows = M.rows; H->cols = M.cols; H->num = 0; k1 = k2 = 1;
while( k1 <= M.num && k2 <= N.num) { = compare(M.data[k1].r, M.data[k1].c, N.data[k2].r, N.data[k2].c); is if(is == -1) { H->num++; H->data[H->num].r = M.data[k1].r; H->data[H->num].c = M.data[k1].c; H->data[H->num].e = M.data[k1].e; k1++; } else if(is == 1) { H->num++; H->data[H->num].r = N.data[k2].r; H->data[H->num].c = N.data[k2].c; H->data[H->num].e = -N.data[k2].e; k2++; } else { if( M.data[k1].e - N.data[k2].e) { H->num++; H->data[H->num].r = M.data[k1].r; H->data[H->num].c = M.data[k1].c; H->data[H->num].e = M.data[k1].e - N.data[k2].e; } k1++; k2++; } } if(k1 <= M.num) { H->num++; H->data[H->num].r = M.data[k1].r; H->data[H->num].c = M.data[k1].c; H->data[H->num].e = M.data[k1].e; k1++; H->num++; H->data[H->num].r = N.data[k2].r; } else {
H->data[H->num].c = N.data[k2].c; H->data[H->num].e = -N.data[k2].e; k2++; } return 1; } int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q)//矩阵的相乘 { int arow, tp,p,brow,t,q,ccol,k; int ctemp[1000]; if(M.cols != N.rows) { printf("对不起,这两个矩阵不能相乘\n"); return 0; } Q->rows = M.rows; Q->cols = N.cols; Q->num = 0; if( M.num * N.num != 0) { for( arow=1; arow<=M.rows; ++arow) { for(k=0; k<1000; k++) { ctemp[k] = 0; } Q->rpos[arow] = Q->num + 1; if( arow < M.rows ) { tp = M.rpos[arow+1] ; } else { tp = M.num + 1; } for(p=M.rpos[arow]; p
} for(ccol = 1; ccol<=Q->cols; ++ccol) { if( ctemp[ccol]) { ++Q->num; Q->data[Q->num].r = arow; Q->data[Q->num].c = ccol; Q->data[Q->num].e = ctemp[ccol]; } } } } return 1; } int compare(int x1, int x2, int y1, int y2)//判断矩阵能否相加、相减、相乘的函数 { if(x1==y1) { if(x2==y2) { return 0; } else if( x2 < y2) { return -1; } else return 1; } else if( x1 < y1) { return -1; } else return 1; } int print(TSMatrix M)//打印矩阵函数 { int k1, k2,k; k1 = k2 = k = 1; for(; k1<=M.rows; k1++) { printf(" ");
分享到:
收藏