矩阵转置及相加实验报告材料.docx
- 文档编号:10488378
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:19
- 大小:74.95KB
矩阵转置及相加实验报告材料.docx
《矩阵转置及相加实验报告材料.docx》由会员分享,可在线阅读,更多相关《矩阵转置及相加实验报告材料.docx(19页珍藏版)》请在冰豆网上搜索。
矩阵转置及相加实验报告材料
1、实验内容和要求
1、稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相加得到矩阵C的算法。
(1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。
(2)设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。
(3)设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。
(4)输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。
2、实验过程及结果
1、需求分析
1、将随机生成的数定义为int型(为方便起见设定范围为-20至20(不含0),可修改),三元组存储的元素分别为非零元的行下标、列下标及该位置的元素值,零元不进行存储。
实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。
2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列排列形式输出)。
3、程序能实现的功能包括:
随机产生稀疏矩阵;
输出阵列形式的矩阵;
输出三元组顺序表;
将矩阵快速转置;
将两个稀疏矩阵相加生成新的矩阵。
2、概要设计
1、稀疏矩阵的抽象数据类型定义:
ADTTSMatrix{
数据对象:
D={aij|i=1,2,…,m,j=1,2,…,n;
Ai,j∈ElemSet,m和n分别称为矩阵的行数和列数}
数据关系:
R={Row,Col}
Row={
Col={
基本操作:
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并返回
}ADTTSMatrix;
⒊本程序模块结构
⑴主函数模块
voidmain(){
初始化迷矩阵;
创建矩阵并输出;
将矩阵转置并输出;
将矩阵相加并输出结果;
}
三、详细设计
1、基本数据类型操作
⑴typedefintElemType;
typedefstruct{
inti,j;
ElemTypee;
}Triple;//数据类型三元组
typedefstruct{
Tripledata[maxsize+1];//矩阵大小
intmu,nu,tu;//
}TSMatrix;//矩阵抽象数据类型
2、参数设置:
#definemaxsize10000
//----------基本操作的算法描述--------------------
StatusCreateTSMatrix(TSMatrix*M){
//创建一个随机矩阵(data[0]未用)
srand((int)time(NULL));
printf("PleaseInputTheLinesAndColumnsOfTheMatrix:
\n");
printf("...(矩阵的期望规格大于4*5(或5*4))...\n");
scanf(M->mu,M->nu);
for(m=0;m
for(n=0;n
k[m][n]=rand()%20;
if(k[m][n]==0){
if(rand()%2)
M->data[p].e=rand()%20+1;
else
M->data[p].e=rand()%20-20;
M->data[p].i=m+1;
M->data[p].j=n+1;
p++;
}
}
}
M->tu=p-1;//p从1开始,非零元个数刚好等于p-1
returnOK;
}
voidPrintTSMatrix(TSMatrixM){
//输出矩阵的三元组顺序表
if(M.tu==0)
printf("无非零元!
\n");
else{
printf("该矩阵的行数为%d、列数为%d、非零元素个数为%d.\n非零元的坐标及值:
\n\n",M.mu,M.nu,M.tu);
printf("行列元素值\n");
for(i=1;i<=M.tu;i++){
printf("%4d%4d%6d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
printf("\n");
}
}
voidPrintTSMatrix1(TSMatrixM){
//输出矩阵的阵列形式
printf("阵列形式为:
\n");
for(i=1;i<=M.mu;i++){
for(j=1;j<=M.nu;j++)
if(k
printf("%4d",p->e);//data[0]未用,p从data[1]开始
p++;
k++;
}
else
printf("%4d",0);
printf("\n");
}
printf("\n");
}
intUnZore(TSMatrixM,introw,intcol){
while(order<=M.tu){
if(M.data[order].i==row&&M.data[order].j==col)//order从1开始
returnorder;
order++;
}
return0;
}
StatusTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix*Q){
//矩阵相加得到新的矩阵,order从1开始
if(M.mu==N.mu&&M.nu==N.nu){
for(row=1;row<=M.mu;row++){
for(col=1;col<=M.nu;col++){
order1=UnZore(M,row,col);
order2=UnZore(N,row,col);
if(order1&&order2){
Q->data[order].i=row;
Q->data[order].j=col;
Q->data[order].e=M.data[order1].e+N.data[order2].e;
order++;
}
elseif(order1&&(!
order2)){
Q->data[order].e=M.data[order1].e;
Q->data[order].i=M.data[order1].i;
Q->data[order].j=M.data[order1].j;
order++;
}
elseif((!
order1)&&order2){
Q->data[order].e=N.data[order2].e;
Q->data[order].i=N.data[order2].i;
Q->data[order].j=N.data[order2].j;
order++;
}
}
}
Q->mu=M.mu;
Q->nu=M.nu;
Q->tu=order-1;
returnOK;
}
else{
printf("\n不是同型矩阵不能进行相加!
\n");
returnERROR;
}
}
StatusFastTransposeSMatrix(TSMatrixM,TSMatrix*N){
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵N
N->mu=M.nu;
N->nu=M.mu;
N->tu=M.tu;
if(N->tu){
for(i=1;i<=M.nu;++i)
num[i]=0;
for(t=1;t<=M.tu;++t)
++num[M.data[t].j];//求M中每一列非零元个数
cpot[1]=1;
//求第col列中第一个元素在b.data中的序号
for(i=2;i<=M.nu;++i)
cpot[i]=cpot[i-1]+num[i-1];
for(p=1;p<=M.tu;++p){
i=M.data[p].j;
q=cpot[i];
N->data[q].i=M.data[p].j;
N->data[q].j=M.data[p].i;
N->data[q].e=M.data[p].e;
++cpot[i];
}
}
returnOK;
}
⑶主函数算法:
voidmain(){
TSMatrixA,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()%20再加1,避免再产生0,为负数时将rand()%20-20。
3、由于稀疏矩阵非零元个数极少,故要求矩阵规格在4*5(或5*4)以上为好,实际上生成非零元时其位置具备随机性,其个数也具备随机性,并不严格小于等于矩阵元素个数的5%,因为控制其随机位置的是通过rand()%20,当该随机数值为0时,将该位置做为非零元位置。
开始时采取随机生成位置以便控制非零元个数小于等于矩阵元素个数的5%,但是这样就不便于将非零元按行列次序存储,而是谁先生成就先存储谁,也无法避免出现重复位置的情况。
4、实验没有采取二维数组的方法来形成矩阵,而是直接用三元组存储的,在输出时通过for循环控制则可输出实现阵列形式的矩阵。
3、用户说明与测试结果
1、本程序的运行环境为windows7(64位)操作系统,执行文件为矩阵.exe;
2、进入演示程序后,即显示对话形式的提示操作过程,
(1)提出输入矩阵的大小
(2)按enter键输出随机生成的矩阵三元组顺序表和整个矩阵
如图所示:
(3)程序自动完成第一个矩阵的转置并输出;
(4)提示输入矩阵B后,用户输入所需矩阵的行数和列数,然后程序将自动完成两个原始矩阵的相加,若不是同型矩阵则提示无法相加。
如图所示:
五、附录(源代码及注释)
#include
#include
#include"time.h"
#definemaxsize10000
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineOVERFLOW-1
typedefintElemType;
typedefintStatus;
typedefstruct{
inti,j;
ElemTypee;
}Triple;//数据类型三元组
typedefstruct{
Tripledata[maxsize+1];//矩阵大小
intmu,nu,tu;//
}TSMatrix;//矩阵抽象数据类型
StatusCreateTSMatrix(TSMatrix*M);//创建矩阵
voidPrintTSMatrix(TSMatrixM);//输出矩阵非零元素
voidPrintTSMatrix1(TSMatrixM);//以阵列形式输出矩阵
intUnZore(TSMatrixM,introw,intcol);//判断位置(row,col)是否存在非零元素
StatusTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix*Q);//将矩阵M,N相加得到Q
StatusFastTransposeSMatrix(TSMatrixM,TSMatrix*N);//快速转置
voidmain()
{
TSMatrixA,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);
}
}
StatusCreateTSMatrix(TSMatrix*M){
intm,n,p=1,num;//data[0]未用,p从1开始;num为非零元个数最大值
intk[100][100];
srand((int)time(NULL));
printf("PleaseInputTheLinesAndColumnsOfTheMatrix:
\n");
printf("...(矩阵的期望规格大于4*5(或5*4))...\n");
printf("TheLineNumber:
");
scanf("%d",&M->mu);
printf("TheColumnNumber:
");
scanf("%d",&M->nu);
/*
for(m=1;m<=M->mu;m++)
for(n=1;n<=M->nu;n++)
k[m][n]=0;
num=(m*n)/20;
printf("%d",num);
for(p=1;p<=num;p++){
m=rand()%M->mu+1;
n=rand()%M->nu+1;
if(rand()%2==1)
k[m][n]=rand()%20+1;
elseif(rand()%2==0)
k[m][n]=rand()%20-20;
}
for(m=1;m<=M->mu;m++){
for(n=1;n<=M->nu;n++){
if(k[m][n]!
=0){
M->data[p].e=k[m][n];
M->data[p].i=m;
M->data[p].j=n;
p++;
}
}
}
*/
for(m=0;m
for(n=0;n
k[m][n]=rand()%20;
if(k[m][n]==0){
if(rand()%2)
M->data[p].e=rand()%20+1;
else
M->data[p].e=rand()%20-20;
M->data[p].i=m+1;
M->data[p].j=n+1;
p++;
}
}
}
M->tu=p-1;//p从1开始,刚好等于非零元个数-1
returnOK;
}
voidPrintTSMatrix(TSMatrixM){
inti;
if(M.tu==0)
printf("无非零元!
\n");
else{
printf("该矩阵的行数为%d、列数为%d、非零元素个数为%d.\n非零元的坐标及值:
\n\n",M.mu,M.nu,M.tu);
printf("行列元素值\n");
for(i=1;i<=M.tu;i++){
printf("%4d%4d%6d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
printf("\n");
}
}
voidPrintTSMatrix1(TSMatrixM){
inti,j,k=0;
Triple*p=M.data;
p++;//data[0]未用,从data[1]开始
printf("阵列形式为:
\n");
for(i=1;i<=M.mu;i++){
for(j=1;j<=M.nu;j++)
if(k
printf("%4d",p->e);
p++;
k++;
}
else
printf("%4d",0);
printf("\n");
}
printf("\n");
}
intUnZore(TSMatrixM,introw,intcol){
intorder=1;//data[0]未用
while(order<=M.tu){
if(M.data[order].i==row&&M.data[order].j==col)
returnorder;
order++;
}
return0;
}
StatusTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix*Q){
introw,col;
intorder=1,order1,order2;//data[0]未用
if(M.mu==N.mu&&M.nu==N.nu){
for(row=1;row<=M.mu;row++){
for(col=1;col<=M.nu;col++){
order1=UnZore(M,row,col);
order2=UnZore(N,row,col);
if(order1&&order2){
Q->data[order].i=row;
Q->data[order].j=col;
Q->data[order].e=M.data[order1].e+N.data[order2].e;
order++;
}
elseif(order1&&(!
order2)){
Q->data[order].e=M.data[order1].e;
Q->data[order].i=M.data[order1].i;
Q->data[order].j=M.data[order1].j;
order++;
}
elseif((!
order1)&&order2){
Q->data[order].e=N.data[order2].e;
Q->data[order].i=N.data[order2].i;
Q->data[order].j=N.data[order2].j;
order++;
}
}
}
Q->mu=M.mu;
Q->nu=M.nu;
Q->tu=order-1;
returnOK;
}
else{
printf("\n不是同型矩阵不能进行相加!
\n");
returnERROR;
}
}
StatusFastTransposeSMatrix(TSMatrixM,TSMatrix*N){
inti,t,p,q,num[100],cpot[100];
N->mu=M.nu;
N->nu=M.mu;
N->tu=M.tu;
if(N->tu){
for(i=1;i<=M.nu;++i)
num[i]=0;
for(t=1;t<=M.tu;++t)
++num[M.data[t].j];
cpot[1]=1;
for(i=2;i<=M.nu;++i)
cpot[i]=cpot[i-1]+num[i-1];
for(p=1;p<=M.tu;++p){
i=M.data[p].j;
q=cpot[i];
N->data[q].i=M.data[p].j;
N->data[q].j=M.data[p].i;
N->data[q].e=M.data[p].e;
++cpot[i];
}
}
returnOK;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 矩阵 相加 实验 报告 材料