稀疏矩阵的运算

您所在的位置:网站首页 利用三元组实现矩阵转置运算的例子 稀疏矩阵的运算

稀疏矩阵的运算

2024-07-11 06:34| 来源: 网络整理| 查看: 265

题目

以三元组的形式给出输入数据,选择对应的运算后给出对应输出结果(稀疏矩阵的运算器)

思路

页面布局就不说了,这里大概说一下各个运算模块的实现 加减法 将三元组中对应的元素行列位置进行比较,将较为靠前的元素直接放进新的三元组存储结构,位置相同的元素通过对应符号判断是加法还是减法,运算后放入新的三元组存储结构,最后输出即可,具体结合代码 乘法 根据输入的两个矩阵,对结果矩阵的行数和列数进行初始化,然后分别求结果矩阵的每一个元素,如果为非零元素,将其加入三元组存储结构,具体结合代码 转置 使用num1数组记录每一列的元素数量,用pos数组记录结果矩阵中每一行的第一个非零元素的位置,然后遍历需要计算的矩阵的非零元素,放入对应位置即可,每次放入后需要将pos数组中对应位置加一,因为此处已经放元素了,下一次就应该放在下一个位置(所以pos[i]数组实际上表示的是原矩阵对应列为i的元素应该放在结果矩阵中的位置)。具体结合代码。

测试数据

加法 输入

1 3 3 2 1 1 1 1 2 2 2 1 1 2 1 3 3

结果 在这里插入图片描述

乘法 输入

3 3 5 5 3 4 1 1 4 1 2 -3 2 4 8 3 3 1 5 1 1 3 2 1 4 2 3 -1 3 2 1 4 1 1

结果 在这里插入图片描述 转置 输入

4 4 4 3 1 1 2 1 2 3 3 2 3

结果 在这里插入图片描述

代码 #include #define MAXSIZE 10000 typedef struct { int row; int col; double value; }Triple; typedef struct { Triple data[MAXSIZE+1]; int rows,cols,nums; //行数,列数,非零元素个数 }TSMatrix; void init(TSMatrix *p,int m,int n); //初始化 void input(TSMatrix *p,int num); //输入 void compute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3,char c); //计算 void mulCompute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3); //乘法 double get(TSMatrix *p,int m,int n);//获取三元组p中存储中处于m行n列的元素值 void transpose(TSMatrix *p,TSMatrix *p3); //稀疏矩阵的转置 int main() { TSMatrix x1,x2,x3; while(1){ printf("1--加\n2--减\n3-乘\n4--转置\n5--退出\n请输入计算方式:"); int choice; scanf("%d",&choice); switch(choice){ case 1: compute(&x1,&x2,&x3,'+'); break; case 2: compute(&x1,&x2,&x3,'-'); break; case 3: mulCompute(&x1,&x2,&x3); break; case 4: transpose(&x1,&x3); } if(choice==5){ break; } printf("结果为(三元组形式---行 列 值):\n"); for(int i=1;idata[cnt].col,&p->data[cnt].value); p->nums++; cnt++; } } //计算 void compute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3,char c) { int m,n,num; printf("请输入要进行计算的稀疏矩阵的行数和列数 m n:"); scanf("%d %d",&m,&n); init(p1,m,n); init(p2,m,n); init(p3,m,n); printf("请输入第一个矩阵的非零元素个数:\n"); scanf("%d",&num); printf("请输入第一个矩阵的非零元素三元组:\n"); input(p1,num); printf("请输入第二个矩阵的非零元素个数:\n"); scanf("%d",&num); printf("请输入第二个矩阵的非零元素三元组:\n"); input(p2,num); int cnt=1; int i=1,j=1; while(inums&&jnums){ if(p1->data[i].rowdata[j].row){ p3->data[cnt]=p1->data[i]; p3->nums++; cnt++; i++; }else if(p1->data[i].row>p2->data[j].row){ p3->data[cnt]=p2->data[j]; p3->nums++; cnt++; j++; }else{ if(p1->data[i].coldata[j].col){ p3->data[cnt]=p1->data[i]; p3->nums++; cnt++; i++; }else if(p1->data[i].coldata[j].col){ p3->data[cnt]=p2->data[j]; p3->nums++; cnt++; j++; }else{ p3->data[cnt]=p1->data[i]; p3->data[cnt].value= c=='+'?p1->data[i].value+p2->data[j].value:p1->data[i].value-p2->data[j].value; p3->nums++; cnt++; i++; j++; } } } while(inums) { p3->data[cnt]=p1->data[i]; p3->nums++; cnt++; i++; } while(jnums){ p3->data[cnt]=p2->data[j]; p3->nums++; cnt++; j++; } } //乘法 void mulCompute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3) { int m,n,num,cnt=1; printf("请输入第一个稀疏矩阵的行数和列数 m n:"); scanf("%d %d",&m,&n); init(p1,m,n); printf("请输入第二个稀疏矩阵的行数和列数 m n:"); scanf("%d %d",&m,&n); init(p2,m,n); if(p1->cols!=p2->rows){ printf("无法进行乘法运算"); return; } init(p3,p1->rows,p2->cols); printf("请输入第一个矩阵的非零元素个数:\n"); scanf("%d",&num); printf("请输入第一个矩阵的非零元素三元组:\n"); input(p1,num); printf("请输入第二个矩阵的非零元素个数:\n"); scanf("%d",&num); printf("请输入第二个矩阵的非零元素三元组:\n"); input(p2,num); for(int i=1;irows;i++){ for(int j=1;jcols;j++){ double sum=0; //sum表示p1中第i行元素与p2中第j列元素对应相乘之和 for(int k=1;kcols;k++){ sum+=get(p1,i,k)*get(p2,k,j); } if(sum){ p3->data[cnt].row=i; p3->data[cnt].col=j; p3->data[cnt].value=sum; cnt++; p3->nums++; } } } } //获取三元组p中存储中处于m行n列的元素值 double get(TSMatrix *p,int m,int n) { for(int i=0;inums;i++){ if(p->data[i].row==m&&p->data[i].col==n){ return p->data[i].value; } } return 0; } //稀疏矩阵的转置 void transpose(TSMatrix *p,TSMatrix *p3) { int m,n,num; printf("请输入要进行转置的稀疏矩阵的行数和列数 m n:"); scanf("%d %d",&m,&n); init(p,m,n); printf("请输入该矩阵的非零元素个数:\n"); scanf("%d",&num); printf("请输入该矩阵的非零元素三元组:\n"); input(p,num); p3->cols=p->rows; p3->rows=p->cols; p3->nums=p->nums; int num1[(p->nums)+1]={0}; int pos[(p->nums)+1]={0}; if(p->nums){ for(int i=1;inums;i++){ num1[p->data[i].col]++; } pos[1]=1; for(int i=2;inums;i++){ pos[i]=pos[i-1]+num1[i-1]; } for(int i=1;inums;i++){ p3->data[pos[p->data[i].col]].col=p->data[i].row; p3->data[pos[p->data[i].col]].row=p->data[i].col; p3->data[pos[p->data[i].col]].value=p->data[i].value; pos[p->data[i].col]++; } } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3