ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:36.68KB ,
资源ID:9255607      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9255607.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(题目稀疏矩阵的相加.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

题目稀疏矩阵的相加.docx

1、题目稀疏矩阵的相加题 目: 稀疏矩阵的相加1、 问题描述稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。2、 设计2.1.存储结构设计稀疏矩阵的行逻辑连接的顺序表存储结构表示如下:#define MAXSIZE 20 /*非零元个数最大值*/#define MAXRC 10 /*各行第一个非零元总数最大值*/typedef struct int i,j; /

2、*行下标,列下标*/ int e; /*非零元值*/Triple;typedef struct /*行逻辑链接的顺序表*/ Triple dataMAXSIZE+1; /*非零元三元组表,data0未用*/ int rposMAXRC+1; /*各行第一个非零元的位置表*/ int mu,nu,tu; /*阵的行数、列数和非零元个数*/TSMatrix;2.2.主要算法设计对2个矩阵相加的算法如下:bool AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q) /*求稀疏矩阵的和Q=M+N*/ int p=1,q=1,k=1; if(M.tu=0&N.tu

3、=0) /*为空矩阵的情况*/ cout该矩阵为空矩阵endl; return 0; while(p=M.tu) /*不为空矩阵的情况,先看M矩阵*/ if(M.datap.iN.dataq.i) /*M的行值比N的大取N的值*/ Q.datak.i=N.dataq.i; Q.datak.j=N.dataq.j; Q.datak.e=N.dataq.e; k+; q+; else /*M的行值和N一样大的情况*/ if(M.datap.jN.dataq.j)/*M的列值比M的大取N的值*/ Q.datak.i=N.dataq.i; Q.datak.j=N.dataq.j; Q.datak.e=

4、N.dataq.e; k+; q+; else /*M和N的列值相等*/ if(M.datap.e+N.dataq.e!=0)/*相加结果不为0才取M值*/ Q.datak.i=M.dataq.i; Q.datak.j=M.dataq.j; Q.datak.e=M.dataq.e+N.datap.e; k+; p+; q+; while(qN.mu) Q.mu=M.mu;/*Q的行和列的值取M,N的最大值*/ else Q.mu=N.mu; if(M.nuN.nu) Q.nu=M.nu; else Q.nu=N.nu; Q.tu=k-1; cout相加成功endl; return 1;2.3.

5、 测试用例设计采用一下2个稀疏矩阵进行测试:M矩阵如下:3 0 0 50 -1 0 02 0 0 0N矩阵如下:0 21 0-2 40 03.调试报告3.1调试过程程序刚写完时有不少问题,像有些变量忘定义,符号错误等等,一些很低级的错误,主要是编程过程中不仔细造成的。改掉这些错误后,程序可以运行了,但用例子进行测试时又出现错误了,运行的结果不正确。就是矩阵相加的结果部分不正确,初步断定算法写的有问题,就对该部分进行调试,设置断点到矩阵相加函数,执行到断点,输入测试用例后,开始观察各变量的值是否正常。刚开始就发现执行顺序有问题,才发现自己误把矩阵的三元表存储当成是数组的形式了,数组是从0开始而三

6、元组是从1开始的,初值设置有问题,于是都设为1,程序运行后与期待结果接近了.但发现程序对于两个矩阵取同一位置时的值相加是否为0的细节处理的不是很好,于是重新作处理,程序结果才显示正确。3.2.对设计和编码的讨论和分析这次设计主要包括以下几个部分:稀疏矩阵的存储结构、矩阵的创建、矩阵的输出、矩阵相加算法的实现、操作说明书的显示部分和主函数。其中稀疏矩阵的存储结构采用行逻辑连接的顺序表的形式。矩阵的创建部分是通过先设置一个初值,然后将后输入的值与前一个值进行比较来进行判断输入的值是否合法来对输入值进行筛选的,取符合要求的值建立矩阵。矩阵输出部分采用一行一行的输出方式,至到输出完为止。矩阵相加部分算

7、法再上面已给出,也给了详细的说明这里就不多说了。说明书显示部分都是一些输出操作,主要是把该程序的操作发发提示给使用者,来方便使用者使用。主函数部分通过输入操作符对程序进行操作,这些操作都是通过调用各个函数来实现的。4.源程序清单和运行结果4.1程序代码如下:#include#includeusing namespace std;/*稀疏矩阵的三元组顺序表类型TSMatrix的定义*/#define MAXSIZE 20 /*非零元个数最大值*/#define MAXRC 10typedef struct int i,j; /*行下标,列下标*/ int e; /*非零元值*/Triple;ty

8、pedef struct /*行逻辑链接的顺序表*/ Triple dataMAXSIZE+1; /*非零元三元组表,data0未用*/ int rposMAXRC+1; /*各行第一个非零元的位置表*/ int mu,nu,tu; /*阵的行数、列数和非零元个数*/TSMatrix;bool CreateSMatrix(TSMatrix &M) /*创建一个稀疏矩阵*/int p=1,a,b,c;cout请输入矩阵的行列和非零元素个数M.muM.nuM.tu;if(M.tuMAXSIZE|M.tuM.mu*M.nu) cout输入错误endl; return 0;while(p=M.tu)

9、cout请输入第p个元素的三元组abc; M.data0.i=1; M.data0.j=1; if(a=M.mu&bM.datap-1.i|(a=M.datap-1.i&b=M.datap-1.j)/*行值比前一个大或行值等于前一个列值小于等于前一个元素*/ M.datap.i=a; M.datap.j=b; M.datap.e=c; p+; cout输入成功endl; else cout输入错误endl; else cout输入错误endl;return 0;bool PrintMatrix(TSMatrix M) /*输出一个矩阵*/ int i,j,p=1; if(M.tu=0) cou

10、t该矩阵为空矩阵endl; return 0; for(i=1;i=M.mu;i+) for(j=1;j=M.nu;j+) if(i=M.datap.i&j=M.datap.j) coutsetw(3)M.datap.e; p+; else coutsetw(3)0; coutendl; return 1;bool AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q) /*求稀疏矩阵的和Q=M+N*/ int p=1,q=1,k=1; if(M.tu=0&N.tu=0) cout该矩阵为空矩阵endl; return 0; while(p=M.tu) if

11、(M.datap.iN.dataq.i) Q.datak.i=N.dataq.i; Q.datak.j=N.dataq.j; Q.datak.e=N.dataq.e; k+; q+; else if(M.datap.jN.dataq.j) Q.datak.i=N.dataq.i; Q.datak.j=N.dataq.j; Q.datak.e=N.dataq.e; k+; q+; else if(M.datap.e+N.dataq.e!=0) Q.datak.i=M.dataq.i; Q.datak.j=M.dataq.j; Q.datak.e=M.dataq.e+N.datap.e; k+;

12、p+; q+; while(qN.mu) Q.mu=M.mu; else Q.mu=N.mu; if(M.nuN.nu) Q.nu=M.nu; else Q.nu=N.nu; Q.tu=k-1; cout相加成功endl; return 1;void Show() /*显示操作说明书*/ cout操作说明书endl; cout输入1创建矩阵Aendl; cout输入2创建矩阵Bendl; cout输入3输出矩阵Aendl; cout输入4输出矩阵Bendl; cout输入5矩阵A+B=C的计算endl; cout输入6输出矩阵Cendl;int main() int select; TSMat

13、rix A,B,C; A.tu=0;B.tu=0;C.tu=0; Show(); while(1) cout请选择你要进行的操作select; if(select=0)break; switch(select) case 1: CreateSMatrix(A); break; case 2: CreateSMatrix(B); break; case 3: PrintMatrix(A); break; case 4: PrintMatrix(B); break; case 5: AddSMatrix(A,B,C); break; case 6: PrintMatrix(C); break; d

14、efault:cout输入错误endl; break; return 0;4.2.实验运行结果运行结果如下:实验结果运行正确。5.经验和体会这次实验使我对稀疏矩阵这部分内容的了解和认识有所加深,包括稀疏矩阵的存储结构、创建过、输出和矩阵相加的实现等等。这次实验使我对数据结构和算法的认识进一步加深,为以后的程序设计积累了宝贵的经验。这次设计虽然达到了实验的要求,但仍存在一些问题,程序功能不是很健全,对一些特殊的操作是否会使程序出错,对于出错程序是否能处理等等。这些问题都有待解决。算法方面也有待改进,我觉得程序若采用十字链表的存储形式来对矩阵相加的算法进行实现会使算法更简洁些,程序中可以不用通过比较行标和列标而只通过比较指针的就可实现对矩阵相加的相应情况的处理。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1