稀疏矩阵的运算(完美版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业课程设计I报告(2011 / 2012 学年第二学期)
题目稀疏矩阵的转换
专业软件工程
学生姓名张鹏宇
班级学号 09003018
指导教师张卫丰
指导单位计算机学院软件工程系
日期 2012年6月18号
指导教师成绩评定表
附件:
稀疏矩阵的转换
一、课题内容和要求
1.问题描述
设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。
2.需求分析
(1)设计函数建立稀疏矩阵,初始化值。
(2)设计函数输出稀疏矩阵的值。
(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。
(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。
(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。
(6)构造函数进行稀疏矩阵的转置,并输出结果。
(7)退出系统。
二、设计思路分析
(1)设计函数建立稀疏矩阵,初始化值。
(2)设计函数输出稀疏矩阵的值。
(3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。
(4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。
(5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。
(6)构造函数进行稀疏矩阵的转置,并输出结果。
(7)退出系统。
三、概要设计
为了实现以上功能,可以从3个方面着手设计。
1.主界面设计
为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主
控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。
2.存储结构设计
本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。
3.系统功能设计
本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。
(1)稀疏矩阵的加法:
此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。
(2)稀疏矩阵的乘法:
此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输
入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。
(3)稀疏矩阵的转置:
此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始化一个矩阵,然后进行转置,最终输出结果。
(4)退出:
即退出稀疏矩阵的应用系统。由函数5实现,但用户选择此功能时,系统会提示你是否确实想退出,如果是,则退出,否则继续。
三、模块设计
1.模块设计
本程序包含1个模块:主程序模块加各功能实现模块。
2.系统子程序及功能设计
本系统共设置7个子程序,各子程序的函数名及功能说明如下。
(1)typedef int ElemType ,&[i].j,&[i].e);
}
for(i=1,k=1;i<=;i++)
{
[i]=k;
while[k].i<=i && k<=
k++;
}
}
void Xiangjia(TSMatrix A,TSMatrix B,TSMatrix &C,int n)
{
int a,b,temp,l;
=;
=;
a=b=l=1;
while(a<= && b<=
{
if[a].i==[b].i)
{
if[a].j<[b].j)
[l++]=[a++];
else if[a].j>[b].j)
{[l]=[b]; [l++].e=n*[b++].e;}
else{
temp=[a].e+n*[b].e;
if(temp)
{
[l]=[a];
[l].e=temp;
l++;
}
a++;b++;
}
}
else if[a].i<[b].i)
[l++]=[a++];
else {[l]=[b]; [l++].e=n*[b++].e;} }
while(a<=
[l++]=[a++];
while(b<=
{[l]=[b]; [l++].e=n*[b++].e;}
=l-1;
}
int Xiangcheng(TSMatrix A,TSMatrix B,TSMatrix &Q) {
int arow,brow,ccol,tp,p,q,t;
int ctemp[MAXRC+1];
if!= return 0;
=;=;=0;
if*
{
for(arow=1;arow<=;arow++)
{
for(ccol=1;ccol<=;ccol++)
ctemp[ccol]=0;
[arow]=+1;
if(arow< tp=[arow+1];
else tp=+1;
for(p=[arow];p { brow=[p].j; if(brow< t=[brow+1]; else t=+1; for(q=[brow];q