1、对称矩阵压缩算法的实现 数据结构课程设计设计说明书对称矩阵压缩算法的实现学生姓名学号班级成绩指导教师数学与计算机科学学院2015年1月2日课程设计任务书20142015学年第一学期专业: 网络工程 学号: 姓名: 课程设计名称: 数据结构课程设计 设 计 题 目: 对称矩阵压缩算法的实现 完 成 期 限:自 2014 年 12 月 22 日至 2015 年 1 月 2 日共 2 周设计内容及要求: 矩阵是一个在科学计算与工程问题中常见的数学对象,在程序设计中这种数学对象常常采用二维数组来存储,然而,有些矩阵具有某些特殊性,如对称矩阵,若用数组存储对称矩阵其空间代价较高,为了降低对称矩阵存储代价
2、,常常采用一维数组只存储对称矩阵中的对角线及其以上或以下元素值,此过程需要进行二维数组(矩阵)下标到一维数组下标的存储变换。请用C/C+语言编写一个程序实现对称矩阵的一维数组压缩存储。设计过程以及写作要求如下:(1)要针对本题目,认真研究所设计的内容,用简明扼要的语言描述课题,给出课题的基本内容及要求;(2)根据数据结构的相关知识给出实现对任意矩阵的输入、对称性的判断、对称矩阵压缩存储的转换,及对转换后的一维数组元素以数学形式打印输出原矩阵的算法基本策略及思路;(3)给出较为详尽数据结构与算法,算法可以用流程图、伪代码等描述手段进行描述;(4)给出一个完整的算法实现的C/C+程序,算法中的各子
3、算法要力求用函数来实现;(5)对编写的程序要进行详尽的测试分析;(6)对本课题的设计工作要进行一个完整深刻的总结。最终设计成果形式为:1、设计软件一套;2、撰写一份课程设计说明书一份,打印并装订成册。指导教师(签字): 教研室主任(签字): 批准日期: 年 月 日数据结构 课程设计评阅书题 目对称矩阵压缩算法的实现学生姓名学 号指导教师评语及成绩成 绩: 教师签名: 年 月 日教研室意见总成绩: 室主任签名: 年 月 日摘要本课程设计是以vc+语言编程软件功能和相关数据结构的知识实现的,借助Visual C+6.0工具实现对称矩阵压缩算法功能的源代码。将矩阵以二维数组的形式存放,通过对称矩阵的
4、压缩存储,从而达到节省存储空间的目的。 关键词:VC+;对称矩阵;压缩存储;节省空间 1 课题描述矩阵是很多科学与工程计算问题中研究的数学对象。在此,人们感兴趣的不是矩阵本身,而是如何存储矩阵的元,从而使矩阵的各种运算能有效的进行。通常,用高级语言编制程序时,都是用二维数组来存储矩阵元。有的程序设计语言中还提供了各种矩阵运算,用户使用时都很方便,然而,在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素。有时为了节省存储空间,可以对这类矩阵进行压缩存储。压缩矩阵:为多个值相同的元止分配一个存储空间;对零元不分配空间。开发工具:Visual C+6.02 设计要求2
5、.1设计要求本次课程设计采用结构化程序设计方法,从整体到模块、逐步细化,模块化设计、结构化编码的算法只适合特殊矩阵中的对称矩阵,面对一般矩阵,不进行压缩存储。存储时采用的顺序存储结构主要为数组,包括一维数组和二维数组。程序中定义了一个结构体Array s,其成员为两个数组,具体设计过程如下:2.2各模块程序的伪码算法(1)构建矩阵: CreatMatrix(Array &s); 操作结果:创建任意n*n矩阵。(2)判断矩阵是否对称: JudgeMatrix(Array &s); 初始条件:矩阵M存在。 操作结果:判断M是否为对称矩阵,若不是,则重新构建,最终得到对称矩阵。(3)压缩存储: Co
6、mpMatrix(Array &s); 初始条件:矩阵M为对称矩阵。 操作结果:将M压缩存储到一维数组中。(4)输出所压缩的对称矩阵: OutputMatrix(Array &s); 初始条件:矩阵M已被压缩存储到一维数组中。 操作结果:将M按照数学形式输出。2.2各模块之间的调用关系图各模块之间的调用关系如图2.1所示。main CreatMatrix JudgeMatrix CompMatrix OutputMatrix CreatMatrix图2.1 各模块之间的调用关系3 模块内的核心算法及流程图3.1构建任意矩阵在构建任意n*n矩阵这个模块中,利用了二维数组来接收所构建矩阵的元。Cr
7、eatMatrix()函数:在构建矩阵时,首先要得到n值,将n值带入构建矩阵中,而输入部分用for循环控制输入格式及元素个数,输入前已规定建立任意矩阵并且元素个数为n*n个,接收时以二维数组的形式来存储从键盘输入的任意元素。输出所构建的矩阵时仍用for循环来输出。输入流程图如图3.1所示,输出流程图如图3.2所示,其中n为行下表或列下标。 开始 开始 输入n值 i=1 行下标初始化为1 n是非零自然数 N 判断非法输入 n0或者n为字符 判断i值与 Y i=n 行下标 输入矩阵 系统提示 N n值的关系 Y i=1 行下标初始化为1 j=1 列下标初始化为1 N i=n 判断i值与行下标n值的
8、关系 Y j=n 判断 j值 j=1 列下标初始化为1 N 与列下标 n值的关系 Y j=n 判断j值与列下标 输出元素 N Y n值的关系 s.Mij 存入元素 j+ j+ i+ i+ 结束 结束 图3.1输入流程图 图3.2输出流程图3.1.1构建矩阵代码int CreatMatrix(Array &s)/构建任意矩阵 int i,j; printf(t请输入您需要构建n阶矩阵中的n值n); scanf(%d,&n); if(n0n); scanf(%d,&n); fflush(stdin); printf(t请输入数组中各元素,输入时请注意:s.Mij=s.Mjin); for(i=1;
9、i=n;i+) for(j=1;j=n;j+) scanf(%d,&s.Mij); printf(tt您构建的矩阵为:n); printf(n); for(i=1;i=n;i+) for(j=1;j=n;j+) printf(t%2d,s.Mij); printf(n); return ok;3.2判断矩阵是否对称由于矩阵的压缩只针对对称矩阵,因此在创建任意矩阵后要判断是否符合压缩要求。JudgeMatrix()函数:函数包括两个小部分,判断部分和判断结果输出部分。在对称矩阵中,Mij=Mji为判断矩阵是否对称的依据,因此,要判断第一步输入的矩阵是否是对称矩阵,就是要判断这一条件是否成立,如果
10、成立,则程序结束,若不成立,则调用函数CreatMatrix重新输入,构建矩阵并再次判断,直到输入的矩阵为对称矩阵结束。判断流程图如图3.3所示,判断结果流程图如图3.4所示。 开始 开始 i=1 行下标初始化为1 调用判断 函数 N i=n 判断i值与行下 得到k值 标n值的关系 Y k=0 j=1 列下标初始 N 化为1 Y N 对称矩阵 构建的不 j=n 判断j值与 构建成功 是对称矩阵 列下标n值 Y 的关系 调用 CreatMatrix s.Mij!=s.Mji 函数 沿对称线元素不对称 矩阵构建成功N Y k+ 结束 j+ 图3.4 判断结果流程图 i+ 结束 图3.3 判断流程图
11、3.2.1判断矩阵是否对称代码int JudgeMatrix(Array s)/判断矩阵是否为对称矩阵 int i,j,k; k=0; for(i=1;i=n;i+) for(j=1;j=n;j+) if(s.Mij!=s.Mji) k+; printf(tt判断得到不相等元素的对数k=%d,k); printf(n); if(k=0) printf(n); printf(ttMij=Mjin); printf(ntt对称矩阵构建正确!请您选择其他服务!n); else printf(n); printf(tt您构建的矩阵不是对称矩阵); return 1; return 0;3.3 对对称矩
12、阵进行压缩存储当判断得到对称矩阵后,便可对其进行压缩存储,将一维数组作为对称矩阵的存储结构从而实现存储过程。CompMatrix()函数:此函数功能是对对称矩阵进行压缩存储,即就是将二维数组压缩存储到一维数组中,压缩存储的元素为下三角元,再将压缩后的数组元素进行输出。压缩部分:通过赋值语句s.mk=s.Mij, 将矩阵进行压缩存储。压缩流程图如图3.5所示,输出流程图如图3.6所示 开始 开始 i=1,k=0 初始化行下标i=1, 压缩时元素个数k 一维数组下标k=0 N i=n 判断行下标 kn*(n+1)/2 i值与 N值的 下三角元素个数 Y 关系 N 初始化 Y j=1 列下标j 输出
13、压缩后 矩阵元素s.Mk N j=i 列下标 与行下标 Y 的比较 结束 s.mk=s.Mij 图3.6 输出流程图 下三角元素赋值给 s.mk k+ j+ i+ 结束 图3.5 压缩流程图3.3.1 对对称矩阵进行压缩存储代码int CompMatrix(Array &s)/对对称矩阵进行压缩存储 int i,j,k=0; for(i=1;i=n;i+) for(j=1;j=i;j+) s.mk=s.Mij; k+; printf(tt压缩后的矩阵存入一维数组后各元素为:n); printf(n); for(k=0;kn*(n+1)/2;k+) printf(%2d,s.mk); return ok; 3.4 将存储后的矩阵按照数学形式输出矩阵的数学形式即为一个二维数组,我们将矩阵进行压缩存储后,其原来的形式被改变,变为一维数组,而所存储的元素个数也少于原矩阵,因此需要编辑函数将矩阵按数学形式输出。OutputMatrix()函数:此函
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1