稀疏矩阵的运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计稀疏矩阵的运算
学生姓名:
学号:
指导教师:
完成日期:
目录:
1、分析问题和确定解决方案 (3)
1.1问题描述 (3)
1.2 输入的形式和输入值的范围 (3)
1.3 输出的形式 (3)
1.4 程序所能达到的功能 (3)
1.5 测试数据 (3)
1.6 确定解决方案 (4)
1.7所有抽象数据类型的定义 (4)
2、详细设计 (5)
2.1稀疏矩阵加法运算思路 (5)
2.2稀疏矩阵减法运算思路 (7)
2.3稀疏矩阵转置运算思路 (9)
2.4创建稀疏矩阵 (11)
3、系统调试与测试 (12)
3.1程序的菜单界面 (12)
3.2 实现加法运算 (12)
3.3 实现减法运算 (13)
3.4实现转置运算 (14)
4、结果分析 (15)
4.1、算法的时空分析 (15)
4.2、经验和体会 (15)
5、参考文献 (15)
1、分析问题和确定解决方案
1.1问题描述
稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计
算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。用三元组实现稀疏矩阵的相加、相减,转置;
1.2输入的形式和输入值的范围
以三元组的形式输入,首先应输入矩阵的行数和列数,并判别给出的两个
矩阵的行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和列数均不超过20;
例如:输入的三元组为:((1,1,10),(2,3,9),(3,1,-1))其对应的稀疏矩阵为:
⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡-0019000010 1.3 输出的形式
运算结果的矩阵以通常的阵列形式输出; 1.4程序所能达到的功能
该程序可以实现以三元组形式输入两个矩阵,求出两个矩阵的和、差、转置;
并可根据输入的矩阵的行列数不同判别是否可以进行相加、减、转置,并重新输
入正确的矩阵;
1.5测试数据
测试的数据及其结果如下:
矩阵M 矩阵N 矩阵Q
加法:
⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡-0019000010 +
⎥⎥⎥⎦⎤
⎢⎢⎢⎣⎡--301100000 = ⎥⎥⎥⎦⎤
⎢⎢⎢⎣⎡-3008000010 减法:
⎥⎥⎥⎦
⎤
⎢⎢⎢⎣⎡-0190010 - ⎥⎥⎥⎦
⎤
⎢⎢⎢⎣⎡--311000 = ⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡-32100010 转置:
⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡-001000000010034 -> ⎥⎥⎥⎥⎥⎦
⎤
⎢⎢⎢⎢⎢⎣⎡001000000103-004
1.6 确定解决方案
进入运算器界面后选择要实行的操作,按1实现矩阵相加,调用函数
AddRLSMatrix ,若输入的两个矩阵行列数不相等,则提示输入错误,重新输入矩阵进行加法运算;按2实现矩阵相减,若输入的两个矩阵行列数不相等,则提示输入错误,重新输入矩阵进行减法运算;按3实现矩阵的转置;按4退出程序 ; 以加法为例实现运算过程,如下:(稀疏矩阵的和为Q) 第一个稀疏矩阵M 的三元组为((1,1,10),(2,3,9),(3,1,-1)) 第二个稀疏矩阵N 的三元组为((2,3,-1),(3,1,1),(3,3,-3))
M 的第一个三元组(1,1,10)与N 的第一个三元组(2,3,-1)比较,因行数1<2则Q 得到第一个三元组(1,1,10);M 的第二个三元组与N 的第一个三元组比较,因对应行列数相等则9+(-1)=8,次行列数就是Q 的行列数即得到Q 的第二个三元组为(2,3,8);M 第三个三元组(3,1,-1))与N 的第二个三元组进行比较,因对应行列数相等,且1+(-1)=0,则不进行相加;而此时只有 N 的第三个三元组(3,3,-3)符合条件,则Q 得到第三个三元组(3,3,-3);最终结果为 ((1,1,10),(2,3,8),(3,3,-3))
1.7所有抽象数据类型的定义
以顺序存储结构来表示三元组表,则可得到稀疏矩阵的一种压缩存储方式——三元组顺序表。
/* 稀疏矩阵的三元组顺序表存储表示 */
#define MAXSIZE 20 //假设非零元个数的最大值为20 typedef struct
{ int i,j; //该非零元的行下标和列下标 ElemType e; //该非零元数值 } Triple;
typedef struct
{ Triple data[MAXSIZE+1]; // 非零三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数(<20)、列数(<20)和非零元个数 } RLSMatrix;
在此,data 域中表示非零元得三元组是以行序为主序顺序排列的,这样有利于进行某些矩阵运算。
抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{
数据对象:D={aij|i=1,2,3,…,m;j=1,2,…,n;
Aij(-ElemSet,m 和n 分别称为矩阵的行数和列数} 数据关系:R={Row,Col}
基本操作:
CreateSMatrix(&M);
操作结果:创建稀疏矩阵M。
PrintSMatrix(M);
初始条件:稀疏矩阵M存在。
操作结果:输出稀疏矩阵M。
AddRLSMatrix(M,N,&Q);
初始条件:稀疏矩阵M和N的的行数和列数对应相等。
操作结果:求稀疏矩阵的和Q=M+N。
SubRLSMatrix(M,N,&Q);
初始条件:稀疏矩阵M和N的的行数和列数对应相等。
操作结果:求稀疏矩阵的差Q=M-N。
TransposeSMatrix(M,&T);
}ADT SpareMatrix
此流程表示的是主程序的流程以及各程序模块之间的层次(调用)关系。
2、详细设计
2.1稀疏矩阵的加法运算思路
比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。其算法如下:void AddRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) //稀疏矩阵相加
{