1、 目前已经可以用于人脸识别、子空间方法预处理技术稀疏近似逆按模最小特征值修正矩阵广义极小残余方法等方面。1.3任务与分析 (1)给出算法并编程实现;(2)任给实例并演示求解结果;(3)给出时间复杂度分析;(4)结合所完成题目,分析总结各算法所使用的算法设计技术,以及相应技术的基本思想。2 程序的主要功能2.1三元组的转置将一个按三元组存储的稀疏矩阵进行转置。2.2三元组的加法将两个按三元组存储的稀疏矩阵进行相加并得出结果。2.3三元组的减法将两个按三元组存储的稀疏矩阵进行相减并得出结果。2.4三元组的乘法将两个按三元组存储的稀疏矩阵进行相乘并得出结果。2.5十字链表的转置 将一个按十字链表存储
2、的稀疏矩阵进行转置。2.6十字链表的加法将两个按十字链表存储的稀疏矩阵进行相加并得出结果。2.7十字链表的减法2.8十字链表的乘法3程序运行平台VC+6.0。编译,链接,执行。4总体设计 图4.1 系统总体框架图5程序类的说明OLNode结构声明typedef struct OLNode int i,j; int e; struct OLNode *right,*down;OLNode,*OLink;Crosslist结构的声明typedef struct int mu,nu,tu; OLink *rhead,*chead;CrossList;Triple结构的声明typedef struct
3、Triple;TSMatrix结构的声明 Triple datamaxsize; int rposmaxsize+1; int nu,mu,tu;TSMatrix;6 模块分析6.1 三元组的转置将一个按三元组存储的稀疏矩阵进行转置(非快速转置)。void TransposeSMatrix(TSMatrix M,TSMatrix &T)/三元组的转置 T.nu=M.mu; T.mu=M.nu; T.tu=M.tu; int q=1; for(int col=1;col=M.nu;col+) for(int p=1;pa2)return 1; else if(a1b2) return 1; if
4、(b1T.mu?M.mu:T.mu; S.nu=M.nuT.nu?M.nu:T.nu; S.tu=0; int ce;int mcount=1,tcount=1; while(mcount=M.tu&tcount=T.tu) switch(Compare(M.datamcount.i,M.datamcount.j,T.datatcount.i,T.datatcount.j) case -1: S.dataq.e=M.datamcount.e; S.dataq.i=M.datamcount.i; S.dataq.j=M.datamcount.j; mcount+; break; case 1:
5、S.dataq.e=T.datatcount.e; S.dataq.i=T.datatcount.i; S.dataq.j=T.datatcount.j; tcount+; case 0: ce=M.datamcount.e+T.datatcount.e; if(ce) S.dataq.e=ce; S.dataq.i=M.datamcount.i; S.dataq.j=M.datamcount.j; q+; mcount+; tcount+; else =M.tu) S.dataq.e=M.datamcount.e; S.dataq.i=M.datamcount.i; S.dataq.j=M.
6、datamcount.j; q+; mcount+; while(tcount S.dataq.e=T.datatcount.e; S.dataq.i=T.datatcount.i; S.dataq.j=T.datatcount.j; tcount+; S.tu=q-1;6.3三元组的减法用户再输入一个稀疏矩阵,系统将两个矩阵进行加运、减算并得出结果。void jianTMatix(TSMatrix M,TSMatrix T,TSMatrix &S)/三元组相减 S.dataq.e=-T.datatcount.e; ce=M.datamcount.e-T.datatcount.e; S.dat
7、aq.e=-T.datatcount.e;6.4三元组的乘法用户再输入一个稀疏矩阵,系统将其进行乘法运算并得出结果。int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) /三元组相乘 int arow,brow,ccol,i,t,ctemp100,p,q,tp; if(M.nu != N.mu) 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) ctempi=0; Q.rposarow=Q.tu+1;
8、if(arowM.mu) tp=M.rposarow+1; else tp=M.tu+1; for(p=M.rposarow;tp;+p) brow=M.datap.j; if(browN.mu) t=N.rposbrow+1; else t=N.tu+1; for(q=N.rposbrow;qt +q) ccol=N.dataq.j; ctempccol+=M.datap.e*N.dataq.e; for(ccol=1;ccolmaxsize) return 1; Q.dataQ.tu.i=arow,Q.dataQ.tu.j=ccol,Q.dataQ.tu.e=ctempccol; retu
9、rn 1;6.5 十字链表的转置 void TurnSMatrix_OL(CrossList &M) /十字链表转置 int col,row; OLink p,q; for(col=1; q=p=M.rheadcol; while(q) row=p-i; p-i=p-j;j=row; q=p-right;right=p-down;down=q;6.6 十字链表的加法int SMatrix_ADD(CrossList *A,CrossList *B) /十字链表相加 OLNode *pa,*pb,*pre,*p,*cp100; int i,j,t; t=A-tu+B-tu; for(j=1;jn
10、u;j+) cpj=A-cheadj; for(i=1;mu;i+) pa=A-rheadi; pb=B- pre=NULL; while(pb) if(pa=NULL|pa-jpb-j) p=(OLink)malloc(sizeof(OLNode); if(!pre) A-rheadi=p; pre-right=p; p-right=pa; pre=p;i=i;j=pb-e=pb-e;A-cheadp-j)j=cpp-j=p; p-down=NULL; cpp-j-down=p; pb=pb- else if(pa- pre=pa; pa=pa-e+pb-e) t-; pa-e+=pb- e
11、lse t=t-2;rheadi=pa-right=pa- p=pa; if(A-j=p)j=p-down=p- free(p); A-mu=A-muB-mu?mu:nu=A-nunu?nu:6.7十字链表的减法int SMatrix_jian(CrossList *A,CrossList *B) /十字链表相减e=-pb-e-pb-e-=pb-6.8十字链表的乘法int MultSMatrix_OL(CrossList M, CrossList N, CrossList &Q) /十字链表相乘 int i, j, e; OLink p0, q0, p, pl, pla; if(M.nu!=N
12、.mu)/检查稀疏矩阵M的列数和N的行数是否对应相等 printf( 稀疏矩阵A的列数和B的行数不相等,不能相乘。n ); Q.nu=N.nu; Q.tu=0; if(!(Q.rhead=(OLink*)malloc(Q.mu+1)*sizeof(OLink) exit(-2);(Q.chead=(OLink*)malloc(Q.nu+1)*sizeof(OLink) =Q.mu; Q.rheadi = NULL;i+) Q.cheadi=NULL;i+) /相乘 for(j=1; p0 = M.rheadi; q0 = N.cheadj; e = 0; while(p0&q0)/M第i行和N
13、第j列有元素 if( p0-j q0-i) q0 = q0- /M的列大于N的行,则N的列指针后移 else if(p0-j /M的列小于N的行,则M的行指针右移 else /M的行等于N的列 e += p0-e * q0- /乘积累加down, p0 = p0-/移动指针 if(e)/乘积不为0(p = (OLink)malloc(sizeof(OLNode) exit(-2); Q.tu+;/非零元素增加j=j;e=e;right=NULL;/赋值,指针后移,将p插入十字链表 行插入 if(Q.rheadi=NULL) /若p为该行的第1个结点 Q.rheadi=p =p; /p插在该行的
14、表头且pl指向p(该行的最后一个结点) pl-right=p,pl=p; /插在pl所指结点之后,pl右移 列插入 if(Q.cheadj = NULL) /若p为该列的第一个结点 Q.cheadj = p; /该列的表头指向p /插在列表尾 pla = Q.cheadj;/pla指向j行的第1个结点 while(pla-down) pla = pla-/pla指向j行最后一个结点 pla-down = p;return 1;7 系统测试首先进入VC+6.0,打开“稀疏矩阵应用.cpp”,编译后执行文件,按系统提示操作。7.1三元组的转置三元组的转置,实现。7.2 三元组的加法三元组的加法,实现。7.3 三元组的减法三元组的减法,实现。7.4 三元组的乘法三元组的乘法,实现
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1