矩阵转置及相加实验报告文档格式.docx
《矩阵转置及相加实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《矩阵转置及相加实验报告文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
M)
操作结果:
创建矩阵M
PrintTSMatrix(M)
初始条件:
矩阵M已存在
输出矩阵M中三元组形式的非零元素
PrintTSMatrix1(M)
以阵列形式输出矩阵
UnZore(M,row,col)
若位置(row,col)处存在非零元素,则返回该元素存储在矩阵中的序号
TSMatrix_Add(M,N,&
Q)
矩阵M,N已存在
将矩阵M,N相加得到Q并返回矩阵Q
FastTransposeSMatrix(M,&
N)
将矩阵M快速转置得到转置矩阵N并返回
}ADTTSMatrix;
⒊本程序模块结构
⑴主函数模块
voidmain(){
初始化迷矩阵;
创建矩阵并输出;
将矩阵转置并输出;
将矩阵相加并输出结果;
}
三、详细设计
1、基本数据类型操作
⑴typedefintElemType;
typedefstruct{
inti,j;
ElemTypee;
}Triple;
//数据类型三元组
Tripledata[maxsize+1];
//矩阵大小
intmu,nu,tu;
//
}TSMatrix;
//矩阵抽象数据类型
2、参数设置:
#definemaxsize10000
//----------基本操作的算法描述--------------------
StatusCreateTSMatrix(TSMatrix*M){
//创建一个随机矩阵(data[0]未用)
srand((int)time(NULL));
printf("
PleaseInputTheLinesAndColumnsOfTheMatrix:
\n"
);
...(矩阵的期望规格大于4*5(或5*4))...\n"
scanf(M->
mu,M->
nu);
for(m=0;
m<
M->
mu;
m++){
for(n=0;
n<
nu;
n++){
k[m][n]=rand()%20;
if(k[m][n]==0){
if(rand()%2)
M->
data[p].e=rand()%20+1;
else
data[p].e=rand()%20-20;
M->
data[p].i=m+1;
data[p].j=n+1;
p++;
}
}
M->
tu=p-1;
//p从1开始,非零元个数刚好等于p-1
returnOK;
}
voidPrintTSMatrix(TSMatrixM){
//输出矩阵的三元组顺序表
if(M.tu==0)
printf("
无非零元!
else{
该矩阵的行数为%d、列数为%d、非零元素个数为%d.\n非零元的坐标及值:
\n\n"
M.mu,M.nu,M.tu);
行列元素值\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);
}
voidPrintTSMatrix1(TSMatrixM){
//输出矩阵的阵列形式
阵列形式为:
for(i=1;
=M.mu;
for(j=1;
j<
=M.nu;
j++)
if(k<
M.tu&
&
p->
i==i&
j==j){
%4d"
p->
e);
//data[0]未用,p从data[1]开始
p++;
k++;
else
0);
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<
row++){
for(col=1;
col<
col++){
order1=UnZore(M,row,col);
order2=UnZore(N,row,col);
if(order1&
order2){
Q->
data[order].i=row;
data[order].j=col;
data[order].e=M.data[order1].e+N.data[order2].e;
order++;
}
elseif(order1&
(!
order2)){
data[order].e=M.data[order1].e;
data[order].i=M.data[order1].i;
data[order].j=M.data[order1].j;
elseif((!
order1)&
data[order].e=N.data[order2].e;
data[order].i=N.data[order2].i;
data[order].j=N.data[order2].j;
Q->
mu=M.mu;
nu=M.nu;
tu=order-1;
returnOK;
\n不是同型矩阵不能进行相加!
returnERROR;
StatusFastTransposeSMatrix(TSMatrixM,TSMatrix*N){
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵N
N->
mu=M.nu;
nu=M.mu;
tu=M.tu;
if(N->
tu){
++i)
num[i]=0;
for(t=1;
t<
++t)
++num[M.data[t].j];
//求M中每一列非零元个数
cpot[1]=1;
//求第col列中第一个元素在b.data中的序号
for(i=2;
cpot[i]=cpot[i-1]+num[i-1];
for(p=1;
p<
++p){
i=M.data[p].j;
q=cpot[i];
data[q].i=M.data[p].j;
data[q].j=M.data[p].i;
data[q].e=M.data[p].e;
++cpot[i];
}
⑶主函数算法:
TSMatrixA,A1,B,C;
矩阵A:
CreateTSMatrix(&
A);
PrintTSMatrix(A);
PrintTSMatrix1(A);
由矩阵A转置得矩阵A1...\n"
FastTransposeSMatrix(A,&
A1);
PrintTSMatrix(A1);
PrintTSMatrix1(A1);
矩阵B:
B);
PrintTSMatrix(B);
PrintTSMatrix1(B);
矩阵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<
stdio.h>
#include<
stdlib.h>
#include"
time.h"
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineOVERFLOW-1
typedefintElemType;
typedefintStatus;
typedefstruct{
}Triple;
}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()
{
intm,n,p=1,num;
//data[0]未用,p从1开始;
num为非零元个数最大值
intk[100][100];
srand((int)time(NULL));
TheLineNumber:
"
scanf("
%d"
&
mu);
TheColumnNumber:
/*
for(m=1;
=M->
m++)
for(n=1;
n++)
k[m][n]=0;
num=(m*n)/20;
num);
=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;
if(k[m][n]!
=0){
data[p].e=k[m][n];
data[p].i=m;
data[p].j=n;
*/
//p从1开始,刚好等于非零元个数-1
inti;
inti,j,k=0;
Triple*p=M.data;
//data[0]未用,从data[1]开始
intorder=1;
//data[0]未用
M.data[order].j==col)
introw,col;
intorder=1,order1,order2;
inti,t,p,q,num[100],cpot[100];
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求