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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];

}

}

相关文档
最新文档