稀疏矩阵基本操作 实验报告Word格式.docx
- 文档编号:1212613
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:24
- 大小:134.87KB
稀疏矩阵基本操作 实验报告Word格式.docx
《稀疏矩阵基本操作 实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵基本操作 实验报告Word格式.docx(24页珍藏版)》请在冰点文库上搜索。
进入第五步
如果矩阵M中第i个元素的行下标大于矩阵N中第j个元素的行下标,则把矩阵N中第j个元素所在行的所有非零元素添加到三元组表中;
如果矩阵M中第i个元素的行下标小于矩阵N中第j个元素的下标,则把M中第i个元素所在行的所有非零元素依次添加到三元组表中。
重复第三步,直到矩阵M和矩阵N中所有元素都非零元素添加到三元组表中。
输出运算结果
5.稀疏矩阵乘法算法:
检查矩阵M和矩阵N能否参与乘法运算(即矩阵M的列数等于矩阵N的行数),如果两个矩阵可以参与乘法运算,进入下一步,否则输出错误信息
检查两个矩阵相乘以后是否为零矩阵,如果相乘结果是零矩阵,直接返回一个零矩阵。
分别计算矩阵M和矩阵N中每行非零元的个数(分别存放到num_m和num_n数组中),并计算出每行首非零元的位置(分别存放到cpot_m和cpot_n中)。
依次取矩阵M中的非零元(第一次取出矩阵M中的第一个非零元),求出该非零元所在行和所在列乘积的和,然后把值放到结果三元组表的特定位置。
重复第四步,直到矩阵M中所有非零元都已经参与运算。
输出结果
四、
程序流程图
五、实验结果
5.1
程序主菜单
5.2
稀疏矩阵三元组的创建和倒置
5.3
稀疏矩阵的加法运算并以三元组输出结果
5.4
稀疏矩阵的乘法运算并以矩阵方式输出结果
六、操作说明
1.在创建稀疏矩阵的时候,可以每次输入一个数据,也可以一次输入多个数据,程序会自动根据输入元素的个数对矩阵数据进行填充
2.每次矩阵运算失败时(无论是输入的矩阵不符合矩阵运算的条件,参与运算其中一个矩阵为空矩阵,或者分配不到临时空间),程序都会返回到主菜单。
输入的数据都会被清空。
七、附录:
代码
#include<
stdio.h>
stdlib.h>
windows.h>
#defineMAXSIZE1000
#defineOK0
#defineMALLOC_FAIL-1//表示分配空间时发生错误
#defineEMPTY_MATRIX-2//表示正尝试对一个空矩阵进行运算操作
#defineMATRIX_NOT_MATCH-3//表示尝试对不符合运算条件的矩阵进行运算操作(例如非相同行数列数矩阵相加)
/*-----------结构体声明部分----------------*/
typedefstruct
{
introw;
//非零元的行下标
intcol;
//非零元的列下标
inte;
//非零元的值
}Triple;
Triple*data;
//非零元素的元素表
intrownum;
//矩阵的行数
intcolnum;
//矩阵的列数
intnum;
//矩阵非零元的个数
}TSMatrix,*PTSMatrix;
/*-----------函数声明部分------------------*/
//初始化稀疏矩阵结构
intTSMatrix_Init(TSMatrix*M);
//以三元组的方式输出稀疏矩阵
voidTSMatrix_PrintTriple(TSMatrix*M);
//以矩阵的方式输出稀疏矩阵
voidTSMartix_PrintMatrix(TSMatrix*M);
//从一个二维数组(普通矩阵)创建一个稀疏矩阵
TSMatrix*TSMatrix_Create(int*a,introw,intcol);
//从键盘录入数据创建一个稀疏矩阵
TSMatrix*TSMatrix_CreateFromInput();
//求稀疏矩阵M的转置矩阵T
intTSMatrix_FastTranspose(TSMatrixM,TSMatrix*T);
//如果稀疏矩阵M和N的行数的列数相同,计算Q=M+N
intTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix*Q);
//如果稀疏矩阵M的列数等于N的行数,计算Q=MxN;
intTSMatrix_Multply(TSMatrixM,TSMatrixN,TSMatrix*Q);
//把光标位置移动到该行行首
voidResetCursor();
/*-----------程序主函数--------------------*/
intmain(void)
intinfo;
charch;
//从一个二维数组创建一个系数矩阵
TSMatrix*M;
TSMatrix*N;
//用来接收运算结果的空间
TSMatrix*T=(TSMatrix*)malloc(sizeof(TSMatrix));
while
(1)
{
fflush(stdin);
system("
cls"
);
printf("
稀疏矩阵基本操作演示\n"
1.矩阵的创建和转置\n"
2.矩阵的加法运算并以三元组输出结果\n"
3.矩阵的乘法运算并以矩阵输出结果\n"
\n"
Q.退出程序\n"
请输入选项:
"
scanf("
%c"
&
ch);
switch(ch)
{
case'
1'
:
system("
M=TSMatrix_CreateFromInput();
if(M!
=NULL)
{
printf("
\n\n以三元组输出稀疏矩阵:
TSMatrix_PrintTriple(M);
\n倒置后稀疏矩阵的三元组输出:
TSMatrix_FastTranspose(*M,T);
TSMatrix_PrintTriple(T);
system("
pause"
}
else
创建矩阵过程发生错误"
break;
2'
N=TSMatrix_CreateFromInput();
if(M==NULL||N==NULL)
创建矩阵过程中发生错误!
break;
info=TSMatrix_Add(*M,*N,T);
if(info==MATRIX_NOT_MATCH)
这两个矩阵不能运算呢!
!
⊙﹏⊙\n"
elseif(info==OK)
\n运算结果:
3'
info=TSMatrix_Multply(*M,*N,T);
TSMartix_PrintMatrix(T);
q'
Q'
exit(0);
}
}
return0;
}
intTSMatrix_Init(TSMatrix*M)
M->
data=(Triple*)malloc(MAXSIZE*sizeof(Triple));
if(!
M->
data)
returnMALLOC_FAIL;
num=0;
colnum=0;
rownum=0;
returnOK;
//从一个二维数组创建一个稀疏矩阵
TSMatrix*TSMatrix_Create(int*a,introw,intcol)
inti,j;
TSMatrix*P=(TSMatrix*)malloc(sizeof(TSMatrix));
TSMatrix_Init(P);
//设置稀疏矩阵的行数和列数
P->
rownum=row;
colnum=col;
for(i=0;
i<
row;
i++)
for(j=0;
j<
col;
j++)
//如果第i+1行第i+1列元素是非零元素
if(0!
=*(a+i*col+j))
//把非零元的元素和位置信息保存到稀疏矩阵中
P->
data[P->
num].e=*(a+i*col+j);
num].row=i+1;
num].col=j+1;
//把稀疏矩阵中的非零元个数加一
num++;
returnP;
voidTSMatrix_PrintTriple(TSMatrix*M)
inti;
if(0==M->
num)
稀疏矩阵为空!
return;
printf("
ijv\n"
===============\n"
num;
%3d%3d%3d\n"
M->
data[i].row,M->
data[i].col,M->
data[i].e);
intTSMatrix_FastTranspose(TSMatrixM,TSMatrix*T)
int*num,*cpot,i,t;
//如果矩阵M为空矩阵,返回错误信息
if(M.num==0)
returnEMPTY_MATRIX;
//分配临时的工作空间
num=(int*)malloc((M.colnum+1)*sizeof(int));
cpot=(int*)malloc((M.colnum+1)*sizeof(int));
//如果临时的工作空间分配不成功
if(num==NULL||cpot==NULL)
//初始化临时工作空间(把num数组用0填充)
for(i=1;
=M.rownum;
num[i]=0;
//统计倒置后每行的元素数量(即统计倒置前矩阵每列元素的数量)
=M.num;
num[M.data[i-1].col]++;
//设置T矩阵每行首个非零元的位置
cpot[1]=0;
for(i=2;
=M.colnum;
cpot[i]=cpot[i-1]+num[i-1];
//把T矩阵的信息清空
TSMatrix_Init(T);
//把矩阵M的信息填充到T中。
//矩阵倒置以后,T的行数等于M的列数,T的列数等于M的行数
T->
num=M.num;
colnum=M.rownum;
rownum=M.colnum;
//对M矩阵中每个非零元素进行转置操作
M.num;
t=cpot[M.data[i].col];
T->
data[t].col=M.data[i].row;
data[t].row=M.data[i].col;
data[t].e=M.data[i].e;
++cpot[M.data[i].col];
//转置完成后释放临时工作空间
free(num);
free(cpot);
intTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix*Q)
inti=0,j=0,k=0;
if(M.colnum!
=N.colnum||M.rownum!
=N.rownum)
returnMATRIX_NOT_MATCH;
//填充结果矩阵信息
TSMatrix_Init(Q);
Q->
colnum=M.colnum;
rownum=M.rownum;
while(i<
M.num&
&
N.num)
//如果ij指向元素是同一行的元素
if(M.data[i].row==N.data[j].row)
//如果i和j指向的元素指向的是同一个元素
if(M.data[i].col==N.data[j].col)
Q->
data[k].row=M.data[i].row;
data[k].col=M.data[i].col;
data[k].e=M.data[i].e+N.data[j].e;
i++;
j++;
k++;
//如果i指向元素的列下标大于j指向元素的列下标
//把下标小(j指向的元素)的放入到Q矩阵中
elseif(M.data[i].col>
N.data[j].col)
data[k].row=N.data[j].row;
data[k].col=N.data[j].col;
data[k].e=N.data[j].e;
//如果i指向元素的列下标小于j指向元素的列下标
//把下标小(i指向的元素)的放入到Q矩阵中
elseif(M.data[i].col<
data[k].e=M.data[i].e;
//如果i指向的元素行下标大于j指向元素的行下标
elseif(M.data[i].row>
N.data[j].row)
Q->
k++;
j++;
//如果i指向元素行下标小于j指向元素的行下标
elseif(M.data[i].row<
i++;
//如果还有剩余元素,按顺序把元素添加到结果矩阵中
M.num)
Q->
i++;
k++;
while(j<
j++;
intTSMatrix_Multply(TSMatrixM,TSMatrixN,TSMatrix*Q)
int*num_m,*cpot_m,*num_n,*cpot_n,i,j,k,s,col;
inta,ri,rj;
//如果两个矩阵不满足矩阵相乘的条件,返回错误信息
//分配临时空间
num_m=(int*)malloc((M.rownum+1)*sizeof(int));
cpot_m=(int*)malloc((M.rownum+1)*sizeof(int));
num_n=(int*)malloc((N.rownum+1)*sizeof(int));
cpot_n=(int*)malloc((N.rownum+1)*sizeof(int));
//填充结果矩阵的信息
colnum=N.colnum;
//如果相乘为零矩阵,直接返回
if(0==M.num*N.num)
returnOK;
//初始化临时空间
num_m[i]=0;
=N.colnum;
num_n[i]=0;
//计算矩阵每行非零元元素的数量
num_m[M.data[i].row]++;
N.num;
num_n[N.data[i].row]++;
cpot_m[1]=cpot_n[1]=0;
for(i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 稀疏矩阵基本操作 实验报告 稀疏 矩阵 基本 操作 实验 报告