一、实验内容和要求
1、 稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相加
得到矩阵C的算法。
(1) 从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。
(2) 设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。
(3) 设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形
式。
(4) 输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得
到的三元组顺序表及其矩阵形式。
二、实验过程及结果
一、需求分析
1、将随机生成的数定义为int型(为方便起见设定范围为-20至20(不含0),可修改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。
2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列排列形式输出)。
3、 程序能实现的功能包括:
①随机产生稀疏矩阵;②输出阵列形式的矩阵;③输出三元组顺序表;④将矩阵快速转置;⑤将两个稀疏矩阵相加生成新的矩阵。
二、概要设计
1、稀疏矩阵的抽象数据类型定义: ADT TSMatrix{
数据对象:D={ aij|i=1,2,…,m,j=1,2,…,n;
Ai,j∈ElemSet,m和n分别称为矩阵的行数和列数}
数据关系:R={Row,Col}
Row={
基本操作:
CreateTSMatrix(&M) 操作结果:创建矩阵M PrintTSMatrix(M)
初始条件:矩阵M已存在
操作结果:输出矩阵M中三元组形式的非零元素 PrintTSMatrix1(M)
初始条件:矩阵M已存在
操作结果:以阵列形式输出矩阵 UnZore(M, row, col)
初始条件:矩阵M已存在
操作结果:若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号 TSMatrix_Add(M, N,&Q)
初始条件:矩阵M,N已存在
操作结果:将矩阵M,N相加得到Q并返回矩阵Q FastTransposeSMatrix(M,&N) 初始条件:矩阵M已存在
操作结果:将矩阵M快速转置得到转置矩阵N并返回 }ADT TSMatrix; ⒊ 本程序模块结构 ⑴ 主函数模块 void main(){
初始化迷矩阵; 创建矩阵并输出; 将矩阵转置并输出; 将矩阵相加并输出结果; }
三、详细设计
1、基本数据类型操作
⑴typedef int ElemType; typedef struct{ int i,j;
ElemType e;
}Triple;.(矩阵的期望规格大于4*5(或5*4))...\\n\ scanf(M->mu,M->nu); for(m=0;m
M->tu=p-1; n非零元的坐标及值:\\n\\n\ printf(\ 行 列 元素值\\n\ for(i=1;i<=;i++){ printf(\ } printf(\ }
}
void PrintTSMatrix1(TSMatrix M){ ==row&&[order].j==col)=row; Q->data[order].j=col; Q->data[order].e=[order1].e+[order2].e; order++; } else if(order1&&(!order2)){ Q->data[order].e=[order1].e; Q->data[order].i=[order1].i; Q->data[order].j=[order1].j; order++; } else if((!order1)&&order2){ Q->data[order].e=[order2].e; Q->data[order].i=[order2].i; Q->data[order].j=[order2].j; order++; } } } Q->mu=; Q->nu=; Q->tu=order-1; return OK; } else{ printf(\不是同型矩阵不能进行相加!\\n\ return ERROR; } }
Status FastTransposeSMatrix(TSMatrix M,TSMatrix *N){ ];;
q=cpot[i];
N->data[q].i=[p].j; N->data[q].j=[p].i; N->data[q].e=[p].e; ++cpot[i]; } }
return OK; }
⑶ 主函数算法: void main(){ TSMatrix A,A1,B,C; printf(\矩阵A:\\n\ CreateTSMatrix(&A); PrintTSMatrix(A); PrintTSMatrix1(A);
printf(\由矩阵A转置得矩阵A1...\\n\ FastTransposeSMatrix(A,&A1); PrintTSMatrix(A1); PrintTSMatrix1(A1); printf(\矩阵B:\\n\ CreateTSMatrix(&B); PrintTSMatrix(B); PrintTSMatrix1(B);
printf(\矩阵A加矩阵B得到矩阵C...\\n\ if(TSMatrix_Add(A,B,&C)){ PrintTSMatrix(C); PrintTSMatrix1(C);
} }
四、调试分析
1、三元组顺序表的输出顺序应该是先按行排序再按列排序,即行主序,依次输出。 2、生成的非零元应该有正数和负数,选取在-20到20之间的数(不包括0),生成随机数时同时随机生成其正负号,为正数时将rand() 再加1,避免再产生0,为负数时将rand() -20。
3、由于稀疏矩阵非零元个数极少,故要求矩阵规格在4*5(或5*4)以上为好,实际上生成非零元时其位置具备随机性,其个数也具备随机性,并不严格小于等于矩阵元素个数的5%,因为控制其随机位置的是通过rand() ,当该随机数值为0时,将该位置做为非零元位置。开始时采取随机生成位置以便控制非零元个数小于等于矩阵元素个数的5%,但是这样就不便于将非零元按行列次序存储,而是谁先生成就先存储谁,也无法避免出现重复位置的情况。
4、实验没有采取二维数组的方法来形成矩阵,而是直接用三元组存储的,在输出时通过for循环控制则可输出实现阵列形式的矩阵。
三、用户说明与测试结果
1、 本程序的运行环境为windows 7(64位)操作系统,执行文件为矩阵.exe; 2、 进入演示程序后,即显示对话形式的提示操作过程, (1)提出输入矩阵的大小
(2)按enter键输出随机生成的矩阵三元组顺序表和整个矩阵 如图所示:
(3)程序自动完成第一个矩阵的转置并输出;
(4)提示输入矩阵B后,用户输入所需矩阵的行数和列数,然后程序将自动完成两个原始矩阵的相加,若不是同型矩阵则提示无法相加。
如图所示: