稀疏矩阵运算器.docx
- 文档编号:29338108
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:27
- 大小:239.88KB
稀疏矩阵运算器.docx
《稀疏矩阵运算器.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵运算器.docx(27页珍藏版)》请在冰豆网上搜索。
稀疏矩阵运算器
《数据结构》课程设计
稀疏矩阵运算器
1.课程设计的目的····························3
2.需求分析··································3
3.概要设计··································4
4.详细设计··································5
5.调试分析··································12
6.用户手册··································12
7.测试结果··································13
8.程序清单···································13
9.小结·······································20
10.参考文献···································20
1.课程设计的目的
(1)、加强对三元组的了解和掌握,学会使用三元组的相关算法;
(2)、掌握稀疏矩阵的压缩存储算法
(3)、掌握矩阵的转置以及矩阵的加法、乘法等算法
(4)、对数据结构基本理论和存储结构及算法设计有更加深入的理解;
(5)、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
2、需求分析
(1)、以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,实现两个矩阵相加、相减和相乘的运算。
稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
(2)、typedefstruct//定义三元组的结构
{inti,j;
intv;
}triple;
classtripletable//定义描述稀疏矩阵及其操作的类
{
public:
tripledata[maxsize];
intrpos[maxsize];
voidconvert();
voidadd();
voidmulti();
private:
intm;
intn;
intt;
inta;
};
(3)、voidtripletable:
:
convert()//矩阵的转置
voidtripletable:
:
add()//矩阵的加法
voidtripletable:
:
multi()//矩阵的乘法
voidmain()//实现菜单选择功能
3、概要设计
程序流程图如下:
4、详细设计
(1)结构设计
typedefstruct//定义三元组的结构
{
inti,j;
intv;
}triple;
classtripletable//定义描述稀疏矩阵及其操作的类
{
public:
tripledata[maxsize];
intrpos[maxsize];
voidconvert();
voidadd();
voidmulti();
private:
intm;
intn;
intt;
inta;
};
(2)、函数设计
①voidtripletable:
:
convert()//矩阵的转置
{
intk;
tripletableA,B;
cout<<"输入稀疏矩阵A的行数,列数和非零元个数:
";
cin>>A.m>>A.n>>A.t;
for(k=1;k<=A.t;k++)
{
printf("输入第%d个非0元素的行数,列数和值:
",k);
cin>>A.data[k].i>>A.data[k].j>>A.data[k].v;
}
B.m=A.m;B.n=A.n;B.t=A.t;
if(B.t)
{
intq=1,col;
for(col=1;col<=A.n;++col)
for(intp=1;p<=A.t;++p)
if(A.data[p].j==col)
{
B.data[q].i=A.data[p].j;
B.data[q].j=A.data[p].i;
B.data[q].v=A.data[p].v;
++q;
}
}
intshuru[100][100]={0};
for(k=1;k<=B.t;k++)
{
shuru[B.data[k].j][B.data[k].i]=B.data[k].v;
}
cout<<"输入为:
"< for(k=1;k<=B.m;k++) { for(intl=1;l<=B.n;l++) cout< cout< } intresult[100][100]={0}; for(k=1;k<=B.t;k++) { result[B.data[k].i][B.data[k].j]=B.data[k].v; } cout<<"结果为: "< for(k=1;k<=B.n;k++) { for(intl=1;l<=B.m;l++) cout< cout< } } ②voidtripletable: : add()//矩阵的加法 { intk; tripletableA,B; cout<<"输入稀疏矩阵A的行数,列数和非零元个数: "; cin>>A.m>>A.n>>A.t; for(k=1;k<=A.t;k++) { printf("输入第%d个非0元素的行数,列数和值: ",k); cin>>A.data[k].i>>A.data[k].j>>A.data[k].v; } cout<<"输入稀疏矩阵B的行数,列数和非零元个数: "; cin>>B.m>>B.n>>B.t; for(k=1;k<=B.t;k++) { printf("输入第%d个非0元素的行数,列数和值: ",k); cin>>B.data[k].i>>B.data[k].j>>B.data[k].v; } if(A.m! =B.m||A.n! =B.n) { cout<<"输入错误: A与B的行数或列数不相同,请重新输入"< return; } inta[100][100]={0}; for(k=1;k<=A.t;k++) { a[A.data[k].i][A.data[k].j]=A.data[k].v; } cout<<"A输入为: "< for(k=1;k<=A.m;k++) { for(intl=1;l<=A.n;l++) cout< cout< } intb[100][100]={0}; for(k=1;k<=B.t;k++) { b[B.data[k].i][B.data[k].j]=B.data[k].v; } cout<<"B输入为: "< for(k=1;k<=B.m;k++) { for(intl=1;l<=B.n;l++) cout< cout< } intc[100][100]={0}; for(k=1;k<=A.m;k++) { for(intl=1;l<=A.n;l++) { c[k][l]=a[k][l]+b[k][l]; } } cout<<"加法结果C为: "< for(k=1;k<=A.m;k++) { for(intl=1;l<=A.n;l++) cout< cout< } } ③voidtripletable: : multi()//矩阵的乘法 { intk; tripletableA,B,C; cout<<"输入稀疏矩阵A的行数,列数和非零元个数: "; cin>>A.m>>A.n>>A.t; for(k=1;k<=A.t;k++) { printf("输入第%d个非0元素的行数,列数和值: ",k); cin>>A.data[k].i>>A.data[k].j>>A.data[k].v; } introw=1; for(k=1;k<=A.t;k++) { while(row<=A.data[k].i) { A.rpos[row++]=k; } } while(row<=A.m)A.rpos[row++]=A.t+1; cout<<"输入稀疏矩阵B的行数,列数和非零元个数: "; cin>>B.m>>B.n>>B.t; for(k=1;k<=B.t;k++) { printf("输入第%d个非0元素的行数,列数和值: ",k); cin>>B.data[k].i>>B.data[k].j>>B.data[k].v; } row=1; for(k=1;k<=B.t;k++) { while(row<=B.data[k].i) { B.rpos[row++]=k; } } while(row<=B.m)B.rpos[row++]=B.t+1; if(A.n! =B.m) { cout<<"输入错误: A的列数不等于B的行数,请重新输入"< return; } C.m=A.m;C.n=B.n;C.t=0; intarow,p,q,ccol,t,tp; if(A.t*B.t! =0) { for(arow=1;arow<=A.m;++arow) { intctemp[maxsize]={0}; C.rpos[arow]=C.t+1; if(arow else{tp=A.t+1;} for(p=A.rpos[arow];p { intbrow=A.data[p].j; if(brow else{t=B.t+1;} for(q=B.rpos[brow];q { ccol=B.data[q].j; ctemp[ccol]+=A.data[p].v*B.data[q].v; } } for(ccol=1;ccol<=C.n;++ccol) { if(ctemp[ccol]) { if(++C.t>maxsize)return; C.data[C.t].i=arow; C.data[C.t].j=ccol; C.data[C.t].v=ctemp[ccol]; } } } } inta[100][100]={0}; for(k=1;k<=A.t;k++) { a[A.data[k].i][A.data[k].j]=A.data[k].v; } cout<<"A输入为: ";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 稀疏 矩阵 运算器