为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

稀疏矩阵运算器

2017-09-20 19页 doc 231KB 42阅读

用户头像

is_995397

暂无简介

举报
稀疏矩阵运算器稀疏矩阵运算器 题目:制作一个稀疏矩阵运算器 班级:数学与应用数学07-2班 姓名:陈星宇 学号:20074637 . [问题描述] 稀疏矩阵是指那么多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大 节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 [基本要求] 以“带行逻辑链接信息”的三元组顺序表示稀疏矩阵,实现两个矩阵相加、相减和相 乘的运算。稀疏矩阵的输入形式采用三元组表示,面运算结果的矩阵则以通常的阵列形式列 出。 [测试数据] 10 0 0 0 0 0 10 0 0 ...
稀疏矩阵运算器
稀疏矩阵运算器 题目:制作一个稀疏矩阵运算器 班级:数学与应用数学07-2班 姓名:陈星宇 学号:20074637 . [问题描述] 稀疏矩阵是指那么多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大 节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 [基本要求] 以“带行逻辑链接信息”的三元组顺序表示稀疏矩阵,实现两个矩阵相加、相减和相 乘的运算。稀疏矩阵的输入形式采用三元组表示,面运算结果的矩阵则以通常的阵列形式列 出。 [测试数据] 10 0 0 0 0 0 10 0 0 0 0 9 + 0 0 -1 = 0 0 8 -1 0 0 1 0 -3 0 0 -3 10 0 0 0 10 0 0 9 — 0 -1 = 0 10 -1 0 1 -3 -2 3 3 0 0 4 -3 0 0 1 4 2 0 0 -6 0 0 0 0 8 0 * 0 1 0 = 8 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 70 0 0 0 0 0 0 1.抽象数据类型稀疏矩阵定义如下 ADT sqarsematrix{ :D={aij|i=1,2,…….,m;j=1,2,……..,n; ai,j?Elemset,m和n分别成为矩阵的行数和列数} :R={row,col} row={|1<=i<=m,1<=j<=n-1} col={ #include #include #define MAXSIZE 100 /*假设非零元个数的最大值为100*/ typedef int status; typedef struct { int i,j; /*该非零元的行下标和列下标*/ int v; }Triple; typedef struct { Triple data[MAXSIZE+1]; /*非零元三元组表,data[0]未用*/ int mu,nu,tu; /*矩阵的行数,列数和非零元个数*/ }TSMatrix; void creat(TSMatrix &T); /*创建三元组*/ void print(TSMatrix A); /*打印计算结果*/ void add(TSMatrix A,TSMatrix B); /*加法运算*/ void sub(TSMatrix A,TSMatrix B); /*减法运算*/ void mult(TSMatrix A,TSMatrix B); /* 乘法运算*/ void creat(TSMatrix &T) { int k; do {system("cls"); system("color 2f"); printf("\n 请输入矩阵!\n"); printf("*********************************\n"); printf(" 请输入三元组的行数mu: "); scanf("%d",&T.mu); if(T.mu<0||T.mu>20) printf("\n 含分数超出定义范围,请重新输入!\n"); } while(T.mu<0||T.mu>20); do { printf(" 请输入三元组的列数nu: "); scanf("%d",&T.nu); if(T.nu<0||T.nu>20) printf("\n 列数超出定义范围,请重新输入!\n"); } while(T.nu<0||T.nu>20); do { printf(" 请输入三元组的非零元素个数tu: "); scanf("%d",&T.tu); if(T.tu>MAXSIZE||(T.tu>T.mu*T.nu)) printf("\n 非零元素个数超出定义范围,请重新输入!\n"); } while(T.tu>MAXSIZE||(T.tu>T.mu*T.nu)); printf("**********************************\n"); for(k=1;k<=T.tu;k++) { do { printf(" 按三元组存储请输入第%d个非零元素的行数i:",k); scanf("%d",&T.data[k].i); if(!T.data[k].i||T.data[k].i>T.mu) printf("\n 输入有误,请重新输入!\n"); } while((!T.data[k].i||T.data[k].i>T.mu)); do { printf(" 按三元组存储请输入第%d个非零元素的列数j:",k); scanf("%d",&T.data[k].j); if(!T.data[k].j||T.data[k].j>T.nu) printf("\n 输入有误,请重新输入!\n"); } while((!T.data[k].j||T.data[k].j>T.nu)); do { printf(" 按三元组存储请输入第%d个非零元素的值v:",k); scanf("%d",&T.data[k].v); if(T.data[k].v==0) printf("\n 输入有误,请重新输入!\n"); } while(T.data[k].v==0); printf("***********************************\n"); } return; } void print(TSMatrix A) /*打印计算结果*/ {int q,n,k,a=0; system("cls"); system("color f2"); printf("\n\n经过稀疏矩阵运算器运算,所得结果为:\n"); printf("***********************************\n"); printf("***********************************\n"); for(n=1;n<=A.mu;n++) { for(k=1;k<=A.nu;k++) { for(q=1;q<=A.tu;q++) {if(A.data[q].i==n&&A.data[q].j==k){printf("\t%-3d",A.data[q].v);break;} } if(q>A.tu)printf("\t%-3d",a); } printf("\n"); } printf("***********************************\n"); printf("***********************************\n"); } void add(TSMatrix A,TSMatrix B)/*加法运算*/ { int n,k; if(A.mu!=B.mu||A.nu!=B.nu) { printf("\n 不满足矩阵相减条件!"); printf("\n 需要满足两矩阵的行数、列数均各自相等方可进行加法运算!!"); } else {for(n=1;n<=A.tu;n++) for(k=1;k<=B.tu;k++)/*将矩阵T的非零元接至M中*/ {if(A.data[n].i==B.data[k].i&&A.data[n].j==B.data[k].j) {A.data[n].v+=B.data[k].v; B.data[k].v=0;} } for(k=1;k<=B.tu;k++) if(B.data[k].v!=0) {A.data[A.tu+1].i=B.data[k].i; A.data[A.tu+1].j=B.data[k].j; A.data[A.tu+1].v=B.data[k].v; A.tu++; } print(A); } } void sub(TSMatrix A,TSMatrix B)/*减法运算*/ {int n,k; if(A.mu!=B.mu||A.nu!=B.nu) { printf("\n 不满足矩阵相减条件!"); printf("\n 需要满足两矩阵的行数、列数均各自相等方可进行加法运算!!"); } else{ for(n=1;n<=A.tu;n++) for(k=1;k<=B.tu;k++)/*将矩阵T的非零元接至M中*/ {if(A.data[n].i==B.data[k].i&&A.data[n].j==B.data[k].j) {A.data[n].v-=B.data[k].v; B.data[k].v=0;} } for(k=1;k<=B.tu;k++) if(B.data[k].v!=0) {A.data[A.tu+1].i=B.data[k].i; A.data[A.tu+1].j=B.data[k].j; A.data[A.tu+1].v=-B.data[k].v; A.tu++;} print(A); } } void mult(TSMatrix A,TSMatrix B)/*乘法运算*/ {int z,n1,k1,n2,k2,s,sum,count=0; TSMatrix Z; int b1[100][100],b2[100][100],b3[100][100]; if(A.nu!=B.mu)printf("矩阵的列数与行数不相等,不能进行相乘的运算!"); else{Z.mu=A.mu; Z.nu=B.nu; for(n1=1;n1<=A.mu;n1++)/*初始化为零*/ for(k1=1;k1<=A.nu;k1++){b1[n1][k1]=0;} for(n1=1;n1<=A.mu;n1++) for(k1=1;k1<=A.nu;k1++){b2[n1][k1]=0;} for(n1=1;n1<=A.tu;n1++)/*装载三元组数据*/ {b1[A.data[n1].i][A.data[n1].j]=A.data[n1].v;} for(n1=1;n1<=B.tu;n1++) {b2[B.data[n1].i][B.data[n1].j]=B.data[n1].v;} for(n1=1;n1<=Z.mu;n1++) { for(k2=1;k2<=Z.nu;k2++) {sum=0; for(k1=1;k1<=Z.nu;k1++) {sum+=b1[n1][k1]*b2[k1][k2];} if(sum!=0) {count++; Z.data[count].i=n1; Z.data[count].j=k2; Z.data[count].v=sum; Z.tu=count;}} } print(Z); } } char menu() {char n; system("color 9f");/*0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 浅绿色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色 6 = 黄色 E = 淡黄色 7 = 白色 F = 亮白色*/ system("color 1f"); system("cls"); printf("\n"); printf("\n 学院:数学学院 班级:数学与应用数学02-2班 学号:20074637 姓名: 陈星宇 \n\n\n"); printf(" **************************************** \n"); printf(" * * \n"); printf(" * 稀 疏 矩 阵 运 算 器 * \n"); printf(" * * \n"); printf(" * 实 现 运 算 * \n"); printf(" * * \n"); printf(" * 1:矩阵相加 * \n"); printf(" * 2:矩阵相減 * \n"); printf(" * 3:矩阵相乘 * \n"); printf(" * 4:退出 * \n"); printf(" * * \n"); printf(" **************************************** \n"); printf(" 你要选择的操作是: "); n=getchar(); return n; } void main() { TSMatrix A,B; for(;;) switch(menu()) {case '1':creat(A); creat(B); add(A,B); getch(); break; case '2':creat(A); creat(B); sub(A,B); getch(); break; case '3':creat(A); creat(B); mult(A,B); getch(); break; case '4':system("cls"); system("color f2"); exit(0); } } 1.本程序的运行环境为WINDOWS操作系统 2.进入演示程序后即显示用户界面: (1)选操作1,即两个矩阵相加: 输入的第一个矩阵为: 10 0 0 0 0 0 -1 0 0 输入的第二个矩阵 0 0 0 0 0 -1 1 0 -3 相加后得结果为: (2)选操作2即两个矩阵相减: 输入第一个矩阵为: 10 0 0 9 -1 0 输入第二个矩阵为: 0 0 0 -1 1 -3 则相减后的结果为: (3)选操作3即两个矩阵相乘: 输入第一个矩阵为: 4 -3 0 0 1 0 0 0 8 0 0 0 1 0 0 0 0 0 0 70 输入第二个矩阵为: 3 0 0 4 2 0 0 1 0 1 0 0 0 0 0 (4)选操作4即推出程序。 这次软件开发课程使我又一次把大学理学的C及C++等软件重新温习了一遍,并同时能从中得到新的知识,加强了知识的硬性,能让自己在以后的受益。 这次设计是我独立完成的,其中免不了向同学、老师请教指导,还翻阅了书籍, 在网上查找资料,这是都是独立动手,去思考。 本次课题是制作一个稀疏矩阵运算器,使用的软件是Microsoft Visual C++ 6.0。稀疏矩阵是指那么多数元素为零的矩阵。利用“稀疏”特点进行存储 和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运 算的运算器。而程序设计时以“带行逻辑链接信息”的三元组顺序表示稀疏矩阵, 实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示, 面运算结果的矩阵则以通常的阵列形式列出。
/
本文档为【稀疏矩阵运算器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索