课程设计稀疏矩阵应用.docx
- 文档编号:6653509
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:24
- 大小:217.13KB
课程设计稀疏矩阵应用.docx
《课程设计稀疏矩阵应用.docx》由会员分享,可在线阅读,更多相关《课程设计稀疏矩阵应用.docx(24页珍藏版)》请在冰豆网上搜索。
课程设计稀疏矩阵应用
数学与计算机学院
课程设计说明书
课程名称:
数据结构课程设计
课程代码:
8404181
题目:
稀疏矩阵应用
年级/专业/班:
学生姓名:
学 号:
开始时间:
2011年06月13日
完成时间:
2011年06月21日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总分(100)
指导教师签名:
年月日
摘要
随着计算机的普及,一句话引出题目…(小四楷体),分析了三元组和十字链表的存储和各种运算的实现,利用C语言编程实现了稀疏矩阵的运算系统,该系统具有三元组十字链表存储下的稀疏矩阵转置、加法、减法、乘法的功能。
关键词:
稀疏矩阵;计算机;运算器
1引言
1.1问题的提出
矩阵是很多科学与工程计算问题中研究的数学对象。
因此,我们感兴趣的不是矩阵本身,而是如何存储矩阵的元,从而使矩阵的各种运算能有效地进行。
通常,用高级语言编制程序时,都是用二维数组来存储矩阵元,有的程序设计语言中还提供了各种矩阵运算,用户使用时很方便。
然而,在数值分析中,经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素,有时为了节省存储空间,可以对这类矩阵进行压缩存储。
所谓压缩存储,就是指:
为多个值相同的元只分配一个存储空间;对零元不分配空间。
1.2国内外研究的现状
目前已经可以用于人脸识别、子空间方法预处理技术稀疏近似逆按模最小特征值修正矩阵广义极小残余方法等方面。
1.3任务与分析
(1)给出算法并编程实现;
(2)任给实例并演示求解结果;
(3)给出时间复杂度分析;
(4)结合所完成题目,分析总结各算法所使用的算法设计技术,以及相应技术的基本思想。
2程序的主要功能
2.1三元组的转置
将一个按三元组存储的稀疏矩阵进行转置。
2.2三元组的加法
将两个按三元组存储的稀疏矩阵进行相加并得出结果。
2.3三元组的减法
将两个按三元组存储的稀疏矩阵进行相减并得出结果。
2.4三元组的乘法
将两个按三元组存储的稀疏矩阵进行相乘并得出结果。
2.5十字链表的转置
将一个按十字链表存储的稀疏矩阵进行转置。
2.6十字链表的加法
将两个按十字链表存储的稀疏矩阵进行相加并得出结果。
2.7十字链表的减法
将两个按十字链表存储的稀疏矩阵进行相加并得出结果。
2.8十字链表的乘法
将两个按十字链表存储的稀疏矩阵进行相加并得出结果。
3程序运行平台
VC++6.0。
编译,链接,执行。
4总体设计
图4.1系统总体框架图
5程序类的说明
∙OLNode结构声明
typedefstructOLNode
{
inti,j;
inte;
structOLNode*right,*down;
}OLNode,*OLink;
∙Crosslist结构的声明
typedefstruct
{
intmu,nu,tu;
OLink*rhead,*chead;
}CrossList;
∙Triple结构的声明
typedefstruct
{
inti,j;
inte;
}Triple;
∙TSMatrix结构的声明
typedefstruct
{
Tripledata[maxsize];
intrpos[maxsize+1];
intnu,mu,tu;
}TSMatrix;
6模块分析
6.1三元组的转置
将一个按三元组存储的稀疏矩阵进行转置(非快速转置)。
voidTransposeSMatrix(TSMatrixM,TSMatrix&T)//三元组的转置
{
T.nu=M.mu;
T.mu=M.nu;
T.tu=M.tu;
intq=1;
for(intcol=1;col<=M.nu;col++)
for(intp=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++;
}
}
intCompare(inta1,intb1,inta2,intb2)
{
if(a1>a2)return1;
elseif(a1 return-1; elseif(b1>b2) return1; if(b1 return-1; else return0; } 6.2三元组减法 用户再输入一个稀疏矩阵,系统将两个矩阵进行加运算并得出结果。 voidAddTMatix(TSMatrixM,TSMatrixT,TSMatrix&S)//三元组相加 { S.mu=M.mu>T.mu? M.mu: T.mu; S.nu=M.nu>T.nu? M.nu: T.nu; S.tu=0; intce; intq=1;intmcount=1,tcount=1; while(mcount<=M.tu&&tcount<=T.tu) { switch(Compare(M.data[mcount].i,M.data[mcount].j,T.data[tcount].i,T.data[tcount].j)) { case-1: S.data[q].e=M.data[mcount].e; S.data[q].i=M.data[mcount].i; S.data[q].j=M.data[mcount].j; q++; mcount++; break; case1: S.data[q].e=T.data[tcount].e; S.data[q].i=T.data[tcount].i; S.data[q].j=T.data[tcount].j; q++; tcount++; break; case0: ce=M.data[mcount].e+T.data[tcount].e; if(ce) { S.data[q].e=ce; S.data[q].i=M.data[mcount].i; S.data[q].j=M.data[mcount].j; q++; mcount++; tcount++; } else { mcount++; tcount++; } break; } } while(mcount<=M.tu) { S.data[q].e=M.data[mcount].e; S.data[q].i=M.data[mcount].i; S.data[q].j=M.data[mcount].j; q++; mcount++; } while(tcount<=M.tu) { S.data[q].e=T.data[tcount].e; S.data[q].i=T.data[tcount].i; S.data[q].j=T.data[tcount].j; q++; tcount++; } S.tu=q-1; }… 6.3三元组的减法 用户再输入一个稀疏矩阵,系统将两个矩阵进行加运、减算并得出结果。 voidjianTMatix(TSMatrixM,TSMatrixT,TSMatrix&S)//三元组相减 { S.mu=M.mu>T.mu? M.mu: T.mu; S.nu=M.nu>T.nu? M.nu: T.nu; S.tu=0; intce; intq=1;intmcount=1,tcount=1; while(mcount<=M.tu&&tcount<=T.tu) { switch(Compare(M.data[mcount].i,M.data[mcount].j,T.data[tcount].i,T.data[tcount].j)) { case-1: S.data[q].e=M.data[mcount].e; S.data[q].i=M.data[mcount].i; S.data[q].j=M.data[mcount].j; q++; mcount++; break; case1: S.data[q].e=-T.data[tcount].e; S.data[q].i=T.data[tcount].i; S.data[q].j=T.data[tcount].j; q++; tcount++; break; case0: ce=M.data[mcount].e-T.data[tcount].e; if(ce) { S.data[q].e=ce; S.data[q].i=M.data[mcount].i; S.data[q].j=M.data[mcount].j; q++; mcount++; tcount++; } else { mcount++; tcount++; } break; } } while(mcount<=M.tu) { S.data[q].e=M.data[mcount].e; S.data[q].i=M.data[mcount].i; S.data[q].j=M.data[mcount].j; q++; mcount++; } while(tcount<=M.tu) { S.data[q].e=-T.data[tcount].e; S.data[q].i=T.data[tcount].i; S.data[q].j=T.data[tcount].j; q++; tcount++; } S.tu=q-1; } 6.4三元组的乘法 用户再输入一个稀疏矩阵,系统将其进行乘法运算并得出结果。 intMultSMatrix(TSMatrixM,TSMatrixN,TSMatrix&Q)//三元组相乘 { intarow,brow,ccol,i,t,ctemp[100],p,q,tp; if(M.nu! =N.mu) return0; Q.mu=M.mu; Q.nu=N.nu; Q.tu=0; if(M.tu*N.tu! =0) { for(arow=1;arow<=M.mu;++arow) { for(i=0;i<=N.nu;++i) ctemp[i]=0; Q.rpos[arow]=Q.tu+1; if(arow tp=M.rpos[arow+1]; else tp=M.tu+1; for(p=M.rpos[arow];p { brow=M.data[p].j; if(brow t=N.rpos[brow+1]; else t=N.tu+1; for(q=N.rpos[brow];q { ccol=N.data[q].j; ctemp[ccol]+=M.data[p].e*N.data[q].e; } } for(ccol=1;ccol<=Q.nu;++ccol) { if(ctemp[ccol]) { if(++(Q.tu)>maxsize) return1; Q.data[Q.tu].i=arow,Q.data[Q.tu].j=ccol,Q.data[Q.tu].e=ctemp[ccol]; } } } } return1; } 6.5十字链表的转置 voidTurnSMatrix_OL(CrossList&M)//十字链表转置 { intcol,row; OLinkp,q; for(col=1;col<=M.mu;col++) { q=p=M.rhead[col]; while(q) { row=p->i; p->i=p->j; p->j=row; q=p->right; p->right=p->down; p->down=q; } } } 6.6十字链表的加法 intSMatrix_ADD(CrossList*A,CrossList*B)//十字链表相加 { OLNode*pa,*pb,*pre,*p,*cp[100]; inti,j,t; t=A->tu+B->tu; for(j=1;j<=A->nu;j++) cp[j]=A->chead[j]; for(i=1;i<=A->mu;i++) { pa=A->rhead[i]; pb=B->rhead[i]; pre=NULL; while(pb) { if(pa==NULL||pa->j>pb->j) { p=(OLink)malloc(sizeof(OLNode)); if(! pre) A->rhead[i]=p; else pre->right=p; p->right=pa; pre=p; p->i=i; p->j=pb->j; p->e=pb->e; if(! A->chead[p->j]) { A->chead[p->j]=cp[p->j]=p; p->down=NULL; } else { cp[p->j]->down=p; cp[p->j]=p; } pb=pb->right; } elseif(pa->j { pre=pa; pa=pa->right; } elseif(pa->e+pb->e) { t--; pa->e+=pb->e; pre=pa; pa=pa->right; pb=pb->right; } else { t=t-2; if(! pre) A->rhead[i]=pa->right; else pre->right=pa->right; p=pa; pa=pa->right; if(A->chead[p->j]==p) A->chead[p->j]=cp[p->j]=p->down; else cp[p->j]->down=p->down; free(p); pb=pb->right; } } } A->mu=A->mu>B->mu? A->mu: B->mu; A->nu=A->nu>B->nu? A->nu: B->nu; return1; } 6.7十字链表的减法 intSMatrix_jian(CrossList*A,CrossList*B)//十字链表相减 { OLNode*pa,*pb,*pre,*p,*cp[100]; inti,j,t; t=A->tu+B->tu; for(j=1;j<=A->nu;j++) cp[j]=A->chead[j]; for(i=1;i<=A->mu;i++) { pa=A->rhead[i]; pb=B->rhead[i]; pre=NULL; while(pb) { if(pa==NULL||pa->j>pb->j) { p=(OLink)malloc(sizeof(OLNode)); if(! pre) A->rhead[i]=p; else pre->right=p; p->right=pa; pre=p; p->i=i; p->j=pb->j; p->e=-pb->e; if(! A->chead[p->j]) { A->chead[p->j]=cp[p->j]=p; p->down=NULL; } else { cp[p->j]->down=p; cp[p->j]=p; } pb=pb->right; } elseif(pa->j { pre=pa; pa=pa->right; } elseif(pa->e-pb->e) { t--; pa->e-=pb->e; pre=pa; pa=pa->right; pb=pb->right; } else { t=t-2; if(! pre) A->rhead[i]=pa->right; else pre->right=pa->right; p=pa; pa=pa->right; if(A->chead[p->j]==p) A->chead[p->j]=cp[p->j]=p->down; else cp[p->j]->down=p->down; free(p); pb=pb->right; } } } A->mu=A->mu>B->mu? A->mu: B->mu; A->nu=A->nu>B->nu? A->nu: B->nu; return1; } 6.8十字链表的乘法 intMultSMatrix_OL(CrossListM,CrossListN,CrossList&Q)//十字链表相乘 { inti,j,e; OLinkp0,q0,p,pl,pla; if(M.nu! =N.mu)//检查稀疏矩阵M的列数和N的行数是否对应相等 { printf("稀疏矩阵A的列数和B的行数不相等,不能相乘。 \n"); return0; } Q.mu=M.mu; Q.nu=N.nu; Q.tu=0; if(! (Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink)))) exit(-2); if(! (Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink)))) exit(-2); for(i=1;i<=Q.mu;i++) Q.rhead[i]=NULL; for(i=1;i<=Q.nu;i++) Q.chead[i]=NULL; for(i=1;i<=Q.mu;i++)//相乘 for(j=1;j<=Q.nu;j++) { p0=M.rhead[i]; q0=N.chead[j]; e=0; while(p0&&q0)//M第i行和N第j列有元素 { if(p0->j>q0->i) q0=q0->down;//M的列大于N的行,则N的列指针后移 elseif(p0->j p0=p0->right;//M的列小于N的行,则M的行指针右移 else//M的行等于N的列 { e+=p0->e*q0->e;//乘积累加 q0=q0->down,p0=p0->right;//移动指针 } } if(e)//乘积不为0 { if(! (p=(OLink)malloc(sizeof(OLNode)))) exit(-2); Q.tu++;//非零元素增加 p->i=i; p->j=j; p->e=e; p->right=NULL; p->down=NULL;//赋值,指针后移,将p插入十字链表行插入 if(Q.rhead[i]==NULL)//若p为该行的第1个结点 Q.rhead[i]=p=p;//p插在该行的表头且pl指向p(该行的最后一个结点) else pl->right=p,pl=p;//插在pl所指结点之后,pl右移列插入 if(Q.chead[j]==NULL)//若p为该列的第一个结点 Q.chead[j]=p;//该列的表头指向p else { //插在列表尾 pla=Q.chead[j];//pla指向j行的第1个结点 while(pla->down) pla=pla->down;//pla指向j行最后一个结点 pla->down=p; } } } return1; } 7系统测试 首先进入VC++6.0,打开“稀疏矩阵应用.cpp”,编译后执行文件,按系统提示操作。 7.1三元组的转置 三元组的转置,实现。 7.2三元组的加法 三元组的加法,实现。 7.3三元组的减法 三元组的减法,实现。 7.4三元组的乘法 三元组的乘法,实现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 稀疏矩阵应用 稀疏 矩阵 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)