数据结构课程设计特殊矩阵运算

发布 2021-05-30 17:50:28 阅读 4169

特殊矩阵运算。

1.1程序功能简介。

对特殊矩阵能够在界面上以人们熟悉的方式显示,可以对特殊矩阵进行加法运算和减法运算,矩阵转置。

按照要求使用了多种数据结构来求解问题,具体为二维数组和类似图的数据结构。

由于题目要求使用多种数据结构,因此分开写了两段程序,均实现了上述要求的功能,以下将分开说明。先说明的是用二维数组实现的程序,后说明的是用图结构实现的程序。

1.2关于输入、输出形式及数据范围。

1.2.1使用二维数组实现的程序。

输入、输出范围为:-73786976294838206000到73786976294838206000,足以解决绝大多数的矩阵运算问题。

1.2.2输入的格式。

进入程序后首先展现的是功能选择界面,如下图:

此时可通过输入对应功能的数字来选择功能。

在此程序中不同功能输入格式不同:

选择功能1.矩阵转置时需要输入要进行转置操作的矩阵,首先输入矩阵的行数和列数,以逗号隔开,之后依次按矩阵形式输入矩阵即可,各数值之间以空格隔开。

选择功能2.矩阵数乘时需要输入要进行数乘操作的矩阵,此输入格式同上,之后输入一个实数,即要进行数乘的数即可。

功能3.矩阵加法与4.矩阵减法输入格式和5.矩阵乘法相同,按上述操作输入两个矩阵即可,需要注意的是矩阵减法默认顺序为先输入的矩阵减去后输入的矩阵。

当按照格式输入时可以实现以上功能,但输入错误数据时,例如进行行列数不同的矩阵相加减时则会返回无法操作,请重新输入的提示。具体情况见下文测试部分。

1.3.1使用图结构实现的稀疏矩阵运算器程序。

输入、输出范围同上。

1.3.2输入的格式。

进入程序后首先展现的是功能选择界面,如下图:

选择功能部分输入同上。

在进行矩阵输入时采取三元组的形式,这是由于稀疏矩阵的多零元性质。

首先输入矩阵的行数、列数、非零元个数,以空格隔开,输入完毕后确认,开始输入各个非零元。

输入非零元时按“所在行下标所在列下标值”的形式输入,需要注意的是输入时只能从所在行小的开始按顺序输入,不能先输入行数大的数据再输入行数小的数据。

2 概要设计。

2.1用二维数组实现的程序的概要设计。

由于使用二维数组结构实现上述功能较为简单,故全部运算仅由主函数执行,不单写出各个简单的函数。通过switch()实现对各个功能的选择。具体如下:

switch(1):进入矩阵转置功能;

switch(2):进入矩阵数乘功能;

switch(3):进入矩阵加法功能;

switch(4):进入矩阵减法功能;

switch(5):进入矩阵乘法功能;

switch(6):结束本程序;

各功能中的矩阵都是以二维数组的形式进行存储与运算的,使用完整的存储方式使矩阵运算在设计上更为便捷,而且面对更多不同运算时也不存在因结构限制而导致的功能缺失。相应的,因为存储了完整矩阵,且运算时都是完整矩阵的每个元素都参与,所以运行相对较慢。

2.2用图结构实现的程序的概要设计。

本模块要求设计函数建立稀疏矩阵并初始化,使用三元组结构。在创建稀疏矩阵时,需要设计三元组创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值。。在对稀疏矩阵进行初始化时,只输入非零元素的值和它所在的所在行及所在列。

在对稀疏矩阵输出时,以矩阵的完整形式输出。本程序存储矩阵的形式是非零元与矩阵形状结合,更适应稀疏矩阵的性质,在存储空间和运算速度上都有较大优势,但在设计各个功能时较为复杂,控制矩阵在运算时的行列变换需要进行复杂的判断和双层for循环来赋零值或进行非零值的运算。

整体结构由主函数调用各个功能函数,条理清晰,具体如下:

流程从运算器的图形界面输出开始,之后进行功能选择,此部分流程同上。

当选择功能1.矩阵加法时先调用矩阵创建函数creat()输入矩阵a,调用输出矩阵函数print_smatrix(),再重复以上流程输入矩阵b,此时进行判断两矩阵能否相加,再调用矩阵加法函数addsmatrix(a,b,c,n)进行矩阵加法运算输出结果矩阵c,结束后调用三次destory_smatrix()函数销毁矩阵a、b、c,最后返回流程开始处进行下一项任务。

功能2矩阵减法流程同功能1矩阵加法。

功能3矩阵转置只需输入矩阵a即可进行下一步调用矩阵转置函数transposesmatrix(),再输出转置后的矩阵b,销毁矩阵a、b后返回流程开始处进行下一项任务。

功能4用来结束程序,在选择功能4后调用break函数跳出switch结束程序。

3详细设计。

3.1二维数组结构的程序的详细设计。

算法1:矩阵的转置运算:

首先是把将要运算的矩阵存放在数组中,矩阵的转置运算,就是把你将要进行运算的a矩阵的行ar和列ac,把a矩阵的行ar作为b矩阵的bc,a矩阵的列ac作为b矩阵的br,这样得到的新矩阵b的行br和列bc就是矩阵a的转置。算法如下:

for(i=0;i

算法2:矩阵的数乘运算。

首先是把将要运算的矩阵存放在数组中,矩阵的数乘运算,就是实现用一个实数k去a矩阵。实数k去乘矩阵的每一行和每一列,得到的一个新的矩阵b,这样就解决了矩阵的数乘运算。算法如下:

for(i=0;i

算法3:矩阵的加法运算;

首先是把将要运算的矩阵存放在数组中,矩阵的加法运算,就是要实现a矩阵与b矩阵进行加法运算。事实上就是a矩阵的每一行ar与b矩阵的每一行br进行加法运算,而得到的一个新的矩阵c的每一行cr就是a矩阵的ar行与b矩阵的br行的和;a矩阵的每一列ac与b矩阵的每一列bc进行加法运算,而得到的一个新的矩阵c的每一列cc就是a矩阵的ac列与b矩阵的bc列的和。这样就实现了a矩阵与b矩阵的加法运算。

算法如下:ar=br;

ac=bc;

for(i=0;i

算法4:矩阵的减法运算;

首先是把将要运算的矩阵存放在数组中,矩阵的减法运算,就是要实现a矩阵与b矩阵进行减法运算。事实上就是a矩阵的每一行ar与b矩阵的每一行br进行减法运算,而得到的一个新的矩阵c的每一行cr就是a矩阵的ar行与b矩阵的br行的差;a矩阵的每一列ac与b矩阵的每一列bc进行减法运算,而得到的一个新的矩阵c的每一列cc就是a矩阵的ac列与b矩阵的bc列的差。这样就实现了a矩阵与b矩阵的减法运算。

算法如下:ar=br;

ac=bc;

for(i=0;i

算法5:矩阵的乘法运算;

首先是把将要运算的矩阵存放在数组中,矩阵的乘法运算,就是要实现a矩阵与b矩阵进行乘法运算。只有当进行运算的a矩阵的列ac等于b矩阵的行br时,两个矩阵才能进行运算,而得到的结果c矩阵要等于a矩阵的行ar和b矩阵的列bc。这样就实现了两个矩阵的乘法运算。

算法如下:

cr=ar;cc=bc;

for(i=0;i

for(j=0;j

for(k=0;k

c[i][j]+=a[i][k]*b[k][j];

3.2图结构的程序的详细设计。

3.2.1主界面的设计:

定义两个矩阵:

矩阵a= 1 2 3矩阵b= 9 8 7

定义两个数组a和b,用于存储矩阵a和矩阵b的值;定义一个数组c,用于存放数组a和数组b相加减后的结果。

3.2.2矩阵存储的实现方式:

稀疏矩阵的存储比较浪费空间,所以我们可以定义两个数组a、b,采用压缩存储的方式来对上面的两个矩阵进行存储。

具体的方法是,将非零元素的值和它所在的行号、列号作为一个结点存放在一起,这就唯一确定一个非零元素的三元组(i、j、v),例如struct triple。将表示稀疏矩阵的非零元素的三元组按行优先的顺序排列,则得到一个其结点均为三元组的线性表rpos[x]。

即:以一维数组顺序存放非零元素的行号、列号和数值,行号-1作为结束标志。例如,上面的矩阵a,利用数组a存储后内容为:

a[0]=0,a[1]=2, a[2]=3, a[3]=1, a[4]=6, a[5]=5, a[6]=3, a[7]=4, a[8]=7, a[9]=5, a[10]=1, a[11]=9, a[12]=-1 。同理,用数组b存储矩阵b的值。

3.2.3稀疏矩阵的加减法实现:

主要算法结构分析:

1)int creatematrix(int a[m][n],int b[50])

这是一个将稀疏矩阵转存的函数,类似于顺序存储三元组表。在这个方法中,只要用一个二重循环来判断每个矩阵元素是否为零,若不为零,则将其行、列下标及其值存入到一维数组b中对应的元素。在定义函数的过程中,我们需要定义一个for循环,以完成行和列的转换及存储。

在函数的末尾我们定义一个b[k]=-1,用于结束非零元素的存储。

数据结构实验 矩阵的运算

目录。实验目的 2 功能描述 2 输入描述 2 输出描述 2 程序分析 2 基本操作 2 主要算法分析 2 矩阵的构建 2 矩阵的加法 3 矩阵的减法 3 矩阵的乘法 4 算法的选择 5 程序运行过程 5 软件启动界面 5 加法运算 6 乘法运算 7 实验总结 8 用户手册 8 运行平台 8 系统要...

数据结构课程设计

课程设计说明书 题目哈夫曼编码问题的设计和实现。课程名称数据结构课程设计。院 系 部 中心。专业。班级。学生姓名。学号。设计地点。指导教师。设计起止时间 2008 年6月 2日至 2008 年 6月 6 日。目录。1 问题描述 2 1.1 题目内容 2 1.2 基本要求 2 1.3 测试数据 2 2...

数据结构课程设计

数据结构 课程设计。实验报告。学院 信息工程学院。班级 姓名 学号 指导老师 题目2 一元多项式的计算。1 实验目的。1 掌握链表的灵活运用 2 学习链表初始化和建立一个新的链表 3 知道怎样去实现链表删除结点操作与插入结点 4 理解链表的基本操作 包括数据域数据的相加 并能灵活运用。2 实验内容。...