数据结构稀疏矩阵基本运算实验报告.doc
《数据结构稀疏矩阵基本运算实验报告.doc》由会员分享,可在线阅读,更多相关《数据结构稀疏矩阵基本运算实验报告.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课 程 设 计课程:数据结构题目:稀疏矩阵4 三元组单链表 结构体(行数、列数、头) 矩阵运算重载运算符 优班级:姓名:学号:设计时间:2010年1月17日2010年5月XX日成绩:指导教师:楼建华一、题目题目稀疏矩阵4结构三元组单链表表示结构体(行数、列数、头)回传方式重载运算符操作矩阵运算 二、概要设计1.存储结构typedef structint row,col;/行,列datatype v;/非0数值Node;typedef structNode datamax;/稀疏矩阵int m,n,t;/m行,n列,t非0数个数Matrix;矩阵a非零数值data1非零数值data2行数m列数n
2、头h行r列c值d行r列c值dmnDatamaxrowcolvrowcolv2.基本操作 istream& operator (istream& input,Matrix *A)/输入 ostream& operator data00481101212332124306max-1(2)乘法运算要点已知稀疏矩阵A(m1 n1)和B(m2 n2),求乘积C(m1 n2)。稀疏矩阵A、B、C及它们对应的三元组表A.data、B.data、C.data如图6所示。由矩阵乘法规则知:C(i,j)=A(i,1)B(1,j)+A(i,2)B(2,j)+A(i,n)B(n,j)=这就是说只有A(i,k)与B(k
3、,p)(即A元素的列与B元素的行相等的两项)才有相乘的机会,且当两项都不为零时,乘积中的这一项才不为零。矩阵用二维数组表示时,a11只有可能和B中第1行的非零元素相乘,a12只有可能和B中第2行的非零元素相乘,而同一行的非零元是相邻存放的,所以求c11和c12同时进行:求a11*b11累加到c11,求a11*b12累加到c12,再求a12*b21累加到c11,再求a12*b22累加到c22.,当然只有aik和bkj(列号与行号相等)且均不为零(三元组存在)时才相乘,并且累加到cij当中去。(3)稀疏矩阵的快速转置要点:矩阵A中三元组的存放顺序是先行后列,对同一行来说,必定先遇到列号小的元素,这
4、样只需扫描一遍A.data 。所以需引入两个向量来实现 :numn+1和position n+1,numcol表示矩阵A中第col列的非零元素的个数(为了方便均从1单元用起),position col初始值表示矩阵A中的第col列的第一个非零元素在B.data中的位置。于是position的初始值为:position 1=1;position col= position col-1+numcol-1; 2coln依次扫描A.data,当扫描到一个col列元素时,直接将其存放在B.data的position col位置上,position col加1,position col中始终是下一个col
5、列元素在B.data中的位置。A-row00112334(4)逆矩阵判断矩阵是否为方阵逆矩阵的算法: 求行列式的值求矩阵的伴随矩阵用伴随矩阵除以行列式 求逆矩阵的流程:四、源程序(测试结果)#include#include#include#includeusing namespace std;#define max 100#define datatype int typedef structint row,col;/行,列datatype v;/非0数值Node;typedef structNode datamax;/稀疏矩阵int m,n,t;/m行,n列,t非0数个数Matrix; /*求
6、逆矩阵存储*/typedef struct /存储结构int m, n; /行、列数double *p; /矩阵基址nMatrix;void In(nMatrix a) /求逆输入 couta.ma.n;int m = a.m, n = a.n;int i, j;double *p = a.p = new doublem * n; /p是行指针cout请按行优先输入矩阵a的全部数值:n;for (i = 0; i m; p += n, i+)for (j = 0; j pj; /即a.pi*n+jvoid Out(nMatrix a) /求逆输出 int m = a.m, n = a.n;in
7、t i, j;double *p = a.p;for (i = 0; i m; p += n, i+)for (j = 0; j n; j+)coutpjt;cout(istream& input,Matrix &A)int i;coutA.m;coutA.n;coutA.t;for(i=1;i=A.t;i+)cout请输入行数,列数,非0值:(iA.datai.rowA.datai.colA.datai.v;return input;ostream& operator (ostream& output,Matrix &A)int i,j,t=1,k=0;for(i=1;i=A.m;i+)fo
8、r(j=1;j=A.n;j+)if(A.datat.row=i&A.datat.col=j)outputA.datat.vt;t+;else outputkt;coutn;return output;Matrix operator +(Matrix A,Matrix B)/加法int i,j,k;Matrix C;if(A.m!=B.m|A.n!=B.n) cout这两个矩阵不能相加endl;exit(0);C.m=A.m;C.n=A.n;C.t=0;if(A.t=0&B.t=0) exit(0);i=j=k=1;while(i=A.t&j=B.t)if(A.datai.rowB.dataj.
9、row)C.datak=B.dataj;j+;k+;elseif(A.datai.colB.dataj.col)C.datak=B.dataj;j+;k+;elseif(A.datai.v+B.dataj.v!=0)C.datak.row=A.datai.row;C.datak.col=A.datai.col;C.datak.v=A.datai.v+B.dataj.v;k+;i+;j+; while(iA.t)C.datak=A.datai;i+;k+;while(jB.t)C.datak=B.dataj;j+;k+;C.t=k; return C;Matrix operator -(Matr
10、ix A,Matrix B)Matrix C;int i,j,k; if(A.m!=B.m|A.n!=B.n) cout这两个矩阵不能相减;exit(0); C.m=A.m;C.n=A.n; C.t=0; if(A.t=0&B.t=0) exit(0); i=j=k=1; while(i=A.t&j=B.t) if(A.datai.rowB.dataj.row) C.datak=B.dataj; j+;k+; else if(A.datai.colB.dataj.col) C.datak=B.dataj; j+;k+; else if(A.datai.v-B.dataj.v!=0) C.dat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 稀疏 矩阵 基本 运算 实验 报告
限制150内