实现稀疏矩阵采用三元组表示的基本运算实验报告.docx
- 文档编号:25530864
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:12
- 大小:48.30KB
实现稀疏矩阵采用三元组表示的基本运算实验报告.docx
《实现稀疏矩阵采用三元组表示的基本运算实验报告.docx》由会员分享,可在线阅读,更多相关《实现稀疏矩阵采用三元组表示的基本运算实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
实现稀疏矩阵采用三元组表示的基本运算实验报告
实现稀疏矩阵(采用三元组表示)的基本运算实验报告
一实验题目:
实现稀疏矩阵(采用三元组表示)的基本运算
二实验要求:
(1)生成如下两个稀疏矩阵的三元组a和b;(上机实验指导P92)
(2)输出a转置矩阵的三元组;
(3)输出a+b的三元组;
(4)输出a*b的三元组;
三实验内容:
3.1稀疏矩阵的抽象数据类型:
ADT SparseMatrix {
数据对象:
D={aij| i = 1,2,3,….,m; j =1,2,3,……,n;
ai,j∈ElemSet,m和n分别称为矩阵的行数和列数 }
数据关系 :
R={ Row , Col }
Row ={
Col ={| 1≤i≤m-1,1≤j≤n}
基本操作:
CreateSMatrix(&M)
操作结果:
创建稀疏矩阵M
PrintSMatrix(M)
初始条件:
稀疏矩阵M已经存在
操作结果:
打印矩阵M
DestroySMatrix(&M)
初始条件:
稀疏矩阵M已经存在
操作结果:
销毁矩阵M
CopySMatrix(M, &T)
初始条件:
稀疏矩阵M已经存在
操作结果:
复制矩阵M到T
AddSMatrix(M, N, &Q)
初始条件:
稀疏矩阵M、N已经存在
操作结果:
求矩阵的和Q=M+N
SubSMatrix(M, N, &Q)
初始条件:
稀疏矩阵M、N已经存在
操作结果:
求矩阵的差Q=M-N
TransposeSMatrix(M, & T)
初始条件:
稀疏矩阵M已经存在
操作结果:
求矩阵M的转置T
MultSMatrix(M, N, &Q)
初始条件:
稀疏矩阵M已经存在
操作结果:
求矩阵的积Q=M*N
}ADTSparseMatrix
3.2存储结构的定义
#defineN4
typedefintElemType;
#defineMaxSize100//矩阵中非零元素最多个数
typedefstruct
{intr;//行号
intc;//列号
ElemTyped;//元素值
}TupNode;//三元组定义
typedefstruct
{introws;//行数值
intcols;//列数值
intnums;//非零元素个数
TupNodedata[MaxSize];
}TSMatrix;//三元组顺序表定义
3.3基本操作实现:
voidCreatMat(TSMatrix&t,ElemTypeA[N][N])
{
inti,j;
t.rows=N;t.cols=N;t.nums=0;
for(i=0;i { for(j=0;j if(A[i][j]! =0) { t.data[t.nums].r=i;t.data[t.nums].c=j; t.data[t.nums].d=A[i][j];t.nums++; } } } voidDispMat(TSMatrixt) { inti; if(t.nums<=0) return; printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums); printf("\t------------------\n"); for(i=0;i printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); } 3.4解题思路: 1.转置矩阵: 只要判定原矩阵有值,那么只要遍历一遍原矩阵,把原来矩阵中非0元素行列变换一下赋值到新的矩阵中即可。 2.矩阵加法: 用各种if判断,区分出矩阵进行加法时的可能情况,分情况处理即可。 3.矩阵乘法: 通过getvalue(c,i,j)函数查找矩阵c中i行j列,所储存的元素的值。 然后便是模拟矩阵乘法的过程进行求解。 3.5解题过程: 实验源代码如下: 3.5.1顺序表的各种运算 #include #defineN4 typedefintElemType; #defineMaxSize100//矩阵中非零元素最多个数 typedefstruct {intr;//行号 intc;//列号 ElemTyped;//元素值 }TupNode;//三元组定义 typedefstruct {introws;//行数值 intcols;//列数值 intnums;//非零元素个数 TupNodedata[MaxSize]; }TSMatrix;//三元组顺序表定义 voidCreatMat(TSMatrix&t,ElemTypeA[N][N]){ inti,j; t.rows=N;t.cols=N;t.nums=0; for(i=0;i { for(j=0;j if(A[i][j]! =0) { t.data[t.nums].r=i;t.data[t.nums].c=j; t.data[t.nums].d=A[i][j];t.nums++; } } } voidDispMat(TSMatrixt){ inti; if(t.nums<=0) return; printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums); printf("\t------------------\n"); for(i=0;i printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); } voidTranMat(TSMatrixt,TSMatrix&tb){ intp,q=0,v;//q为tb.data的下标 tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums; if(t.nums! =0) { for(v=0;v for(p=0;p if(t.data[p].c==v) { tb.data[q].r=t.data[p].c; tb.data[q].c=t.data[p].r; tb.data[q].d=t.data[p].d; q++; } } } boolMatAdd(TSMatrixa,TSMatrixb,TSMatrix&c){ inti=0,j=0,k=0; ElemTypev; if(a.rows! =b.rows||a.cols! =b.cols) returnfalse;//行数或列数不等时不能进行相加运算 c.rows=a.rows;c.cols=a.cols;//c的行列数与a的相同 while(i { if(a.data[i].r==b.data[j].r)//行号相等时 { if(a.data[i].c { c.data[k].r=a.data[i].r;//将a元素添加到c中 c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++;i++; } elseif(a.data[i].c>b.data[j].c)//a元素的列号大于b元素的列号 { c.data[k].r=b.data[j].r;//将b元素添加到c中 c.data[k].c=b.data[j].c; c.data[k].d=b.data[j].d; k++;j++; } else//a元素的列号等于b元素的列号 { v=a.data[i].d+b.data[j].d; if(v! =0)//只将不为0的结果添加到c中 { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c; c.data[k].d=v; k++; } i++;j++; } } elseif(a.data[i].r { c.data[k].r=a.data[i].r;//将a元素添加到c中 c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++;i++; } else//a元素的行号大于b元素的行号 { c.data[k].r=b.data[j].r;//将b元素添加到c中 c.data[k].c=b.data[j].c; c.data[k].d=b.data[j].d; k++;j++; } c.nums=k; } returntrue; } intgetvalue(TSMatrixc,inti,intj) { intk=0; while(k =i||c.data[k].c! =j)) k++; if(k return(c.data[k].d); else return(0); } boolMatMul(TSMatrixa,TSMatrixb,TSMatrix&c) { inti,j,k,p=0; ElemTypes; if(a.cols! =b.rows)//a的列数不等于b的行数时不能进行相乘运算 returnfalse; for(i=0;i for(j=0;j { s=0; for(k=0;k s=s+getvalue(a,i,k)*getvalue(b,k,j); if(s! =0)//产生一个三元组元素 { c.data[p].r=i; c.data[p].c=j; c.data[p].d=s; p++; } } c.rows=a.rows; c.cols=b.cols; c.nums=p; returntrue; } intmain() { ElemTypea1[N][N]={{1,0,3,0}, {0,1,0,0}, {0,0,1,0}, {0,0,1,1}}; ElemTypeb1[N][N]={{3,0,0,0}, {0,4,0,0}, {0,0,1,0}, {0,0,0,2}}; TSMatrixa,b,c; CreatMat(a,a1);CreatMat(b,b1); printf("a的三元组: \n");DispMat(a); printf("b的三元组: \n");DispMat(b); printf("a转置为c\n"); TranMat(a,c); printf("c的三元组: \n");DispMat(c); printf("c=a+b\n"); MatAdd(a,b,c); printf("c的三元组: \n");DispMat(c); printf("c=a×b\n"); MatMul(a,b,c); printf("c的三元组: \n");DispMat(c); return0; } 四实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 稀疏 矩阵 采用 三元 表示 基本 运算 实验 报告