数据结构课程设计 特殊矩阵运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
特殊矩阵运算
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 { for(j=0;j { B[j][i]=A[i][j]; } } 算法2:矩阵的数乘运算 首先是把将要运算的矩阵存放在数组中,矩阵的数乘运算,就是实现用一个实数k去A矩阵。实数k去乘矩阵的每一行和每一列,得到的一个新的矩阵B,这样就解决了矩阵的数乘运算。算法如下: for(i=0;i { for(j=0;j { B[i][j]=k*A[i][j]; } } 算法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 { for(j=0;j { C[i][j]=A[i][j]+B[i][j]; } }