数据结构----稀疏矩阵运算器课程设计
目 录
稀疏矩阵运算器设计 ............................................................................................ I 摘 要 ................................................................................................................... II
第一章 需求分析 .......................................................................................... 1 第二章 概要设计 .......................................................................................... 2 第三章 设计步骤 .......................................................................................... 6 3.1 函数说明 ....................................................................................... 6 3.2 设计步骤 ....................................................................................... 7 第四章 设计理论分析方法 ........................................................................ 20 4.1 算法一:矩阵转置 ..................................................................... 20 4.2 算法二:矩阵加法 ..................................................................... 20 4.3 算法三:矩阵乘法 ..................................................................... 21 第五章 程序调试 ........................................................................................ 23 第六章 心得体会 ........................................................................................ 25 参考文献 .................................................................................................... 26
第一章 需求分析
1. 稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。
2. 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,求逆,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。 3. 演示程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。
4. 由题目要求可知:首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
5. 程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。
6. 在用三元组表示稀疏矩阵时,相加、乘积和相减所得结果矩阵应该另生成;矩阵求逆时,为了算法方便,使用二维数组存放。 7. 程序在VC6.0环境下设计。
程序执行的命令为:1.稀疏矩阵转置; 2.稀疏矩阵加法; ;3. 稀疏矩阵乘法; 4.退出 的工作。
第二章 概要设计
1. 抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{
数据对象:D={aij|i=1,2,…,m; j=1,2,…,n;
aij∈ElemSet, m和n分别为矩阵的行数和列数}
数据关系:R={Row,Col }
Row={﹤ai,j, ai,j+1﹥| 1≤i≤m, 1≤j≤n-1} Col = {﹤ai,j, ai+1,j﹥| 1≤i≤m-1, 1≤j≤n} 基本操作:
create(TSMatrix &TM)
操作结果:创建稀疏矩阵矩阵TM
LocateELem(TSMatrix M,int i,int j,int e)
初始条件:稀疏矩阵M存在
操作结果:稀疏矩阵中是否存在非零元素A[i][j],若存在返回e
disp(TSMatrix TM)
初始条件:稀疏矩阵TM存在 操作结果:通常形式输出稀疏矩阵 InsertSortMatrix(TSMatrix &TM)
初始条件:稀疏矩阵TM存在
操作结果:根据对矩阵的行列,三元组TM作直接插入排序 TransposeSMatrix(TSMatrix M,TSMatrix &T) 初始条件:稀疏矩阵M和T存在
操作结果:求稀疏矩阵M转置的稀疏矩阵T AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C) 初始条件:稀疏矩阵A,B和C存在
操作结果:稀疏矩阵的加法运算:C=A+B
SubTSM(TSMatrix A,TSMatrix B,TSMatrix &C) 初始条件:稀疏矩阵A,B和C存在 操作结果:稀疏矩阵的减法运算:C=A-B MultSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C) 初始条件:稀疏矩阵A,B和C存在 操作结果:稀疏矩阵的乘法运算:C=A×B NiMatrix(TSMatrix &TM) 初始条件:稀疏矩阵TM存在 操作结果:稀疏矩阵求逆 }ADT SparseMatrix;
2. 主程序: void main( ) {初始化;
do {
接受命令;
选择处理命令; }while(命令!=“退出”) }
3. 本程序有四个模块,调用关系如下:
4 本程序的流程图
主程序模块 矩阵输入模块 矩阵运算模块 矩阵输出模块 图2.1
开始 选择1,选择2,进行矩阵加法运算 选择要执行的操作 选择3,进行矩阵乘法运算 选择4,退出程序 进行矩阵 转置运算 输出结果 输入n个矩阵A的行数、列数、非零元个数
图2.2
结束 第三章 设计步骤
3.1函数说明
稀疏矩阵的三元组顺序表存储表示: typedef struct // 定义三元组的元素 { int i,j; int v; }Triple; class tripletable
{ //设计类来描述稀疏矩阵及其操作 public:
aaa *pdata;
triple data[maxsize]; int rpos[maxsize]; tripletable(); ~tripletable(); void convert() ; void add( );
void multi ( ); private: int m ; int n ; int t ; int a ; };
主要函数: tripletable(); ~tripletable(); void convert( ) ; void add( ); void multi ( ); void main( ); 3.2设计步骤:
设计一个矩阵类实现矩阵的运算:class tripletable(包含矩阵的各种运算函数)。
输入矩阵(以三元组形式输入非零元) { int k;
tripletable A,B;
cout<<\"输入稀疏矩阵A的行数,列数和非零元个数:\";
cin>>A.m>>A.n>>A.t; for(k=1;k<=A.t;k++) {
printf(\"输入第%d个非0元素的行数,列数和值:\ cin>>A.data[k].i>>A.data[k].j>>A.data[k].v; } 输出矩阵: int c[100][100]={0};
for(k=1;k<=B.t;k++) {
c[B.data[k].i][B.data[k].j]=B.data[k].v; }
cout<<\"转置(加法,乘法)结果为:\"< void tripletable::convert( ) //矩阵的转置 { int k; tripletable A,B; cout<<\"输入稀疏矩阵A的行数,列数和非零元个数:\"; cin>>A.m>>A.n>>A.t; for(k=1;k<=A.t;k++) { printf(\"输入第%d个非0元素的行数,列数和值:\ 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) { int q=1,col; for(col=1;col<=A.n;++col) for(int p=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; } } int shuru[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.t;k++) { result[B.data[k].i][B.data[k].j]=B.data[k].v; } cout<<\"结果为:\"< cout< 加法矩阵: void tripletable::add( ) //矩阵的加法 { int k; tripletable A,B; cout<<\"输入稀疏矩阵A的行数,列数和非零元个数:\"; cin>>A.m>>A.n>>A.t; for(k=1;k<=A.t;k++) { printf(\"输入第%d个非0元素的行数,列数和值:\ 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元素的行数,列数和值:\ cin>>B.data[k].i>>B.data[k].j>>B.data[k].v; } if(A.m!=B.m||A.n!=B.n) {