稀疏矩阵运算器稀疏矩阵运算器
题目:制作一个稀疏矩阵运算器 班级:数学与应用数学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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。