稀疏矩阵运算器实习报告Word文档格式.docx
《稀疏矩阵运算器实习报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵运算器实习报告Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
AddSMatrix(M,N,&
Q);
稀疏矩阵M与N的行数和列数对应相等.
求稀疏矩阵的和Q=M+N.
SubSMatrix(M,N,&
求稀疏矩阵的差Q=M-N.
MultSMatrix(M,N,&
稀疏矩阵M的列数等于N的行数.
求稀疏矩阵的乘积Q=M*N.
2、本程序包含四个模块
1)主程序模块
Voidmain()
{
初始化
Do{
接受命令;
处理命令;
}while(命令!
=“退出”)
}
2)模块调用关系图
主程序模块
↓
创建稀疏矩阵模块
运算稀疏矩阵模块
三、详细设计
#defineMAXSIZE20
#defineMAXRC10
#include<
iostream>
usingnamespacestd;
typedefstruct
inti,j;
inte;
}Triple;
typedefstruct
Tripledata[MAXSIZE+1];
intrpos[MAXRC+1];
intmu,nu,tu;
//mu是行,nu是列,tu是非零元个数
}Matrix;
voidcreatematrix(Matrix&
M)
intm,n,t,e;
intnum[MAXSIZE+1];
//每行非零元素个数
do{
cout<
<
"
输入矩阵的行数,列数和非零元数:
endl;
矩阵行数:
;
cin>
>
m;
矩阵列数:
n;
非零元个数:
t;
if(m<
0||n<
0||t<
0||t>
m*n)
cout<
error"
}while(m<
m*n);
//检测输入是否合法
M.mu=m,M.nu=n,M.tu=t;
//保存数据
inti,j,k,a;
intflag[MAXSIZE][MAXSIZE];
//标记数组:
此位置是否已经有非零元素
for(i=0;
i<
MAXSIZE;
i++)//标记数组的初始化
for(j=0;
j<
j++)
flag[i][j]=0;
for(k=1;
k<
=t;
k++)
{
do{
输入第"
个非零元(共"
t<
个)的行数,列数和非零元:
cin>
i>
j>
e;
if(i<
=0||i>
m||j<
=0||j>
n)
cout<
if(flag[i][j]!
=0)
{
重复!
flag[i][j]=2;
}
if(e==0)
}while(i<
n||flag[i][j]==2||e==0);
for(a=1;
a<
=k-1&
&
(i>
M.data[a].i||(i==M.data[a].i&
M.data[a].j));
a++);
//找到此三元组插入的位置
for(intb=k-1;
b>
=a;
b--)
M.data[b+1]=M.data[b];
//行序比它大的三元组依次向后移动
M.data[a].i=i;
M.data[a].j=j;
M.data[a].e=e;
}
for(i=1;
=M.mu;
i++)
num[i]=0;
for(t=1;
=M.tu;
t++)
num[M.data[t].i]++;
//求M中每一行含非零元素个数
M.rpos[1]=1;
for(i=2;
M.rpos[i]=M.rpos[i-1]+num[i-1];
voidprintmatrix(MatrixM)//输出矩阵
for(inti=1,k=1;
for(intj=1;
=M.nu;
{
if(M.data[k].i==i&
M.data[k].j==j)
M.data[k].e<
\t"
k++;
else
0\t"
}
cout<
矩阵共有"
M.mu<
行"
M.nu<
列"
M.tu<
个非零元元素"
voidjiafa(MatrixM,MatrixN,Matrix&
Q)
if(M.mu!
=N.mu||M.nu!
=N.nu)
Q.mu=M.mu;
Q.nu=M.nu;
Q.tu=0;
intm,n,t;
m=n=t=1;
for(introw=1;
row<
row++)
if(M.data[m].i==row&
N.data[n].i==row)//矩阵行数相等
if(M.data[m].j==N.data[n].j)//矩阵列数相等
intsum=M.data[m].e+N.data[n].e;
if(sum!
{
Q.data[t].i=row;
Q.data[t].j=M.data[m].j;
Q.data[t].e=sum;
Q.tu++;
++m;
++n;
++t;
}
else
while(M.data[m].i==row)//M矩阵剩下的元素
Q.data[t].i=row;
Q.data[t].j=M.data[m].j;
Q.data[t].e=M.data[m].e;
Q.tu++;
++m;
++t;
while(N.data[n].i==row)//N矩阵剩下的元素
Q.data[t].j=N.data[n].j;
Q.data[t].e=N.data[n].e;
++n;
矩阵相加结果为:
printmatrix(Q);
voidjianfa(MatrixM,MatrixN,Matrix&
=M.nu)
intcha=M.data[m].e-N.data[n].e;
if(cha!
Q.data[t].e=cha;
m++;
n++;
t++;
m++;
t++;
inte1=N.data[n].e;
e1=0-e1;
Q.data[t].e=e1;
n++;
矩阵相减结果为"
voidchengfa(MatrixM,MatrixN,Matrix&
intctemp[MAXSIZE+1];
inttp,t,col,p,q;
intarow=1,brow=1;
if(M.nu!
=N.mu)//稀疏矩阵M的列数和N的行数不相等,不能相乘
Q.nu=N.nu;
if(M.tu*N.tu!
for(arow=1;
arow<
arow++)
for(inti=1;
=Q.nu;
ctemp[i]=0;
//当前行各元素累加器清零
Q.rpos[arow]=Q.tu+1;
if(arow<
M.mu)
tp=M.rpos[arow+1];
tp=M.tu+1;
for(p=M.rpos[arow];
p<
tp;
p++)//对当前行中的每一个非零元
brow=M.data[p].j;
//找到对应元在N中的行号
if(brow<
N.mu)
t=N.rpos[brow+1];
t=N.tu+1;
for(q=N.rpos[brow];
q<
q++)
col=N.data[q].j;
//乘积元素在Q中列号
ctemp[col]+=M.data[p].e*N.data[q].e;
for(col=1;
col<
col++)//压缩存储该行非零元
if(ctemp[col])
if(++Q.tu>
MAXSIZE)
cout<
Q.data[Q.tu].i=arow;
Q.data[Q.tu].j=col;
Q.data[Q.tu].e=ctemp[col];
矩阵相乘结果为:
intmain()
intchioce;
MatrixM,N,Q;
inti;
1、输入矩阵1:
2、输入矩阵2:
3、矩阵相加"
4、矩阵相减"
5、矩阵相乘"
6、结束"
输入选择功能:
chioce;
switch(chioce)
case1:
creatematrix(M);
printmatrix(M);
i=1;
break;
case2:
creatematrix(N);
printmatrix(N);
case3:
jiafa(M,N,Q);
case4:
jianfa(M,N,Q);
case5:
chengfa(M,N,Q);
case6:
i=0;
}while(i!
=0);
return0;
四、调试分析
1、开始对三元组了解不彻底,致使代码总是出现基本错误
2、对于矩阵相乘的算法参考了书很久,并请教了同学
3、矩阵乘法运算在调试中出现多次错误,反复试验才调试好
5、用户手册
1.本程序的运行环境为DOS操作系统,执行文件为TestMaze.exe
2.进入演示程序后即显示文本方式的用户界面: