稀疏矩阵的相关操作.docx

上传人:b****5 文档编号:3095621 上传时间:2022-11-17 格式:DOCX 页数:28 大小:330.42KB
下载 相关 举报
稀疏矩阵的相关操作.docx_第1页
第1页 / 共28页
稀疏矩阵的相关操作.docx_第2页
第2页 / 共28页
稀疏矩阵的相关操作.docx_第3页
第3页 / 共28页
稀疏矩阵的相关操作.docx_第4页
第4页 / 共28页
稀疏矩阵的相关操作.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

稀疏矩阵的相关操作.docx

《稀疏矩阵的相关操作.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵的相关操作.docx(28页珍藏版)》请在冰豆网上搜索。

稀疏矩阵的相关操作.docx

稀疏矩阵的相关操作

数据结构课程设计

设计说明书

 

稀疏矩阵相关操作的实现

学生姓名

学号

班级

成绩

指导教师

 

数学与计算机科学学院

2012年3月2日

数据结构课程设计评阅书

题目

稀疏矩阵相关操作的实现

学生姓名

学号

指导教师评语及成绩

成绩:

教师签名:

年月日

答辩教师评语及成绩

成绩:

教师签名:

年月日

教研室意见

总成绩:

室主任签名:

年月日

注:

指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。

课程设计任务书

2011—2012学年第二学期

专业:

__________________学号:

__________姓名:

_______

课程设计名称:

数据结构课程设计

设计题目:

稀疏矩阵相关操作的实现

完成期限:

自____年_月__日至____年_月_日共_周

设计内容:

用C/C++编写程序实现稀疏矩阵创建、销毁、输出、复制、求和、求差、求乘积和转置等相关操作(详见数据结构教材P96),并进行算法分析。

设计要求:

1)问题分析和任务定义:

根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?

(而不是怎么做?

)限制条件是什么?

确定问题的输入数据集合。

2)逻辑设计:

对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。

逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;

3)详细设计:

定义相应的存储结构并写出各函数的伪码算法。

在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。

详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;

4)程序编码:

把详细设计的结果进一步求精为程序设计语言程序。

同时加入一些注解和断言,使程序中逻辑概念清楚;

5)程序调试与测试:

采用自底向上,分模块进行,即先调试低层函数。

能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。

调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;

6)结果分析:

程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。

算法的时间、空间复杂性分析;

7)编写课程设计报告;

以上要求中前三个阶段的任务完成后,先将设计说明数的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。

设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。

 

指导教师(签字):

教研室主任(签字):

批准日期:

2012年2月20日

 

摘要

矩阵是很多科学与工程计算问题中研究的数学对象,通常用高级语言编制程序时,都是用二维数组来存储矩阵元的,有的程序设计语言中还提供了各种矩阵运算,用户使用时都很方便,然而,在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素,为了节省存储空间,可以对这类矩阵进行压缩存储。

当值相同的元素或者零元素在矩阵中的分布有一定规律时,则称此类矩阵为特殊矩阵,反之称为稀疏矩阵。

这里设计了一个稀疏矩阵相关操作的软件,该软件具有简单的稀疏矩阵相关运算功能。

本稀疏矩阵操作软件采用VC++作为软件开发环境,采用算数表达式处理算法来实现稀疏矩阵的加法、减法、乘法以及转置运算。

操作简单,界面清晰,易于为用户所接受。

关键字:

三元组、稀疏矩阵、数据结构

 

目录

第一章课题描述2

1.1课程设计的目的2

1.2问题描述2

1.3 基本要求2

第二章问题分析和任务定义3

2.1结构设计3

2.2算法思想3

第三章逻辑设计4

3.1模块划分4

3.2函数调用图4

3.3流程图5

第四章详细设计6

4.1定义矩阵6

4.2创建稀疏矩阵6

4.3求矩阵的转置7

4.4矩阵的相乘7

4.5矩阵的相加9

第五章程序编码13

第六章程序调试与测试22

6.1运行该程序的操作平台22

6.2错误分析22

第七章结果分析23

7.1程序运行结果23

7.2时间及空间复杂度分析25

第八章总结26

第一章课题描述

1.1课程设计的目的

本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。

利用三元组实现稀疏矩阵的有关算法。

1.2问题描述

1.2.1稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵M和N的相加矩阵Q,并输出Q。

1.2.2求出M的转置矩阵T,输出T。

1.3 基本要求

稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

实现一个能进行稀疏矩阵基本运算的运算器。

以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。

稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

第二章问题分析和任务定义

2.1结构设计

2.1.1以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘以及转置的运算。

2.1.2稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

2.1.3首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

可设矩阵的行数和列数均不超过20。

2.1.4程序可以对三元组的输入顺序加以限制,例如,按行优先。

注意研究教材的算法,以便提高计算效率。

2.1.5在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放

2.2算法思想

2.2.1主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。

2.2.2设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法以及转置。

2.2.3在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为0。

第三章逻辑设计

3.1模块划分

3.1.1Typedefstruct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos[]值为零

3.1.2Greatesmatrix(RLSMatrix&M)矩阵输入函数,输入各行非零元及其在矩阵中的行列数

3.1.3TransposeSMatrix(RLSMatrixM,RLSMatrix&T)矩阵转置

3.1.4HeRLSMatrix(RLSMatrix*M,RLSMatrix*N,RLSMatrix*Q)矩阵求和

3.1.5ChaRLSMatrix(RLSMatrix*M,RLSMatrix*N,RLSMatrix*Q)矩阵求差

3.1.6MultSMatrix(RLSMatrixM,RLSMatrixN,RLSMatrix&Q)矩阵求积

3.2函数调用图

图3.2关系调用图

3.3流程图

图3.3流程

第四章详细设计

4.1定义矩阵

#include

#include

#defineOK1

#defineERROR0

#defineMAXSIZE100//非零元个数的最大值

#defineMAXROW100

typedefstructtriple

{

inti,j;//行下标,列下标

inte;//非零元素值

}triple;

typedefstructRLSMatrix

{

tripledata[MAXSIZE+1];//非零元三元组表

intrpos[MAXROW+1];//各行第一个非零元的位置表

intmu,nu,tu,num;//矩阵行数、列数和非零元个数

}RLSMatrix;

4.2创建稀疏矩阵

Greatesmatrix(RLSMatrix&M)//创建稀疏矩阵

{

inte,i,m,n;

M.data[0].i=0;//为以下比较顺序做准备

printf("请输入矩阵的行数,列数,和非零元素的个数:

");

scanf("%d",&M.mu);scanf("%d",&M.nu);scanf("%d",&M.tu);

for(i=1;i<=M.tu;i++)

{

printf("请按行序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:

",i,M.mu,M.nu);

scanf("%d",&m);scanf("%d",&n);scanf("%d",&e);

if(m<1||m>M.mu||n<1||n>M.nu)

{printf("行或列超出范围");exit(0);}

M.data[i].i=m;

M.data[i].j=n;

M.data[i].e=e;

}

returnOK;

}

4.3求矩阵的转置

cpos为存放每列的第一个非零元素的地址,temp为中间变量对cpos对初始化,判断初值为0则为cpos赋值,然后进行转置。

voidTransposeSMatrix(RLSMatrixM,RLSMatrix&T)

{//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T

intq,p;

T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;

if(T.tu)

{

q=1;

for(intcol=1;col<=M.nu;++col)

for(p=1;p<=M.tu;++p)

if(M.data[p].j==col)

{

T.data[q].i=M.data[p].j;

T.data[q].j=M.data[p].i;

T.data[q].e=M.data[p].e;

++q;

}

}

return;

}//TransposeRLSMatrix

4.4矩阵的相乘

设置两个数组,分别存储M,N的第一个非零元位置,然后进行进行比较,得出相乘后的新矩阵非零元。

对于M中的每个元素M.data[p](p=1,2,…,M.tu)找到N中所有满足条件M.data[p].j=N.data[q].i的元素N.data[q],球的M.data[p],求得M.data[p]和N.data[q]的乘积。

乘积矩阵Q中每个元素的值是个累计和,这个乘积M.data[p]XN.data[q]只是Q[i][j]中的一部分,为便于操作,对应每个元素设一累计和的变量,其初置为零,然后扫描数组M,球的相应元素的乘积并累加到适当的求累计和的变量上

intMultSMatrix(RLSMatrixM,RLSMatrixN,RLSMatrix&Q)

{//求矩阵乘积Q=MxN,采用行逻辑链接存储表示

intarow,tp,p,brow,t,q,ccol;

intctemp[MAXSIZE],num[MAX

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 判决书

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

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