稀疏矩阵的建立与转置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验2 稀疏矩阵的建立与转置
一、实验目的
掌握特殊矩阵的存储和操作算法。
二、实验内容及问题描述
实现用三元组保存稀疏矩阵并实现矩阵转置的算法。
三、实验步骤
1. 定义稀疏矩阵的三元组形式的存储结构。
2. 实现三元组矩阵的传统转置算法。
3. 实现三元组矩阵的快速转置算法。
4. 输入矩阵非零元素,测试自己完成的算法。
四、程序流程图
五、概要设计
矩阵是很多的科学与工程计算中研究的数学对象。在此,我们感兴趣的是,从数学结构这门学科着眼,如何存储矩阵的元从而使矩阵的各种运算有效的进行。本来,用二维数组存储矩阵,在逻辑上意义是很明确的,也很容易理解,操作也很容易和方便。但是在数值分析中经常出现一些阶数很高的矩阵,同时,在矩阵中又有很多值相同或者都为零的元素,可以对这种矩阵进行压缩存储:对多个值相同的元素只分配一个存储空间;对零元素不分配空间。稀疏矩阵的定义是一个模糊的定义:即非零元个数较零元个数较少的矩阵。例如下图所示的矩阵
为一个稀疏矩阵。为了实现稀疏矩阵的这种存储结构,引入三元组这种数据结构。三元组的线性表顺存储形式如下图:
六、详细设计
sanyuanzu.h 头文件
#define max 100
typedef struct
{
int row,col;
int e;
}Triple;//定义三元组
typedef struct
{
Triple data[max];
int mu,nu,tu;
}TSMatrix;///*定义三元组的稀疏矩阵*/
void creat( TSMatrix &M) ;
void fasttrans(TSMatrix A,TSMatrix &B);
void printfx(TSMatrix x);
sanyuanzu.cpp 文件
#include
#include"sanyuanzu.h"
/*建立三元组的稀疏矩阵*/
void creat( TSMatrix &M)
{
printf("请输入稀疏矩阵的行数:");
scanf("%d",&M.mu);
printf("请输入稀疏矩阵的列数:");
scanf("%d",&M.nu);
printf("请输入矩阵中非零元素的个数:");
scanf("%d",&M.tu);
int i;
printf("请输入这%d 个元素的行号和列号及其元素的值:/n",M.tu);
for(i = 1; i <= M.tu;
i++)scanf("%d %d %d",&M.data[i].row,&M.data[i].col,&M.data[i].e);
}
/*实现三元组的矩阵转置的函数*/
void fasttrans(TSMatrix A,TSMatrix &B)
{
int col,cpot[max],num[max],t,p,q;
/*初始化矩阵B*/
B.mu=A.nu;
B.nu=A.mu;
B.tu=A.tu;
if(B.tu)
{
for(col=1;col<=A.nu;++col)
num[col]=0;/*初始化每一列非零元的个数*/
for(t=1;t<=A.tu;++t)
++num[A.data[t].col];/*计算每一列非零元的个数*/
cpot[1]=1;
for(col=2;col<=A.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];//计算矩阵A 每一列第一个非零元在B.data 中的位置
/*实现对A 中的每一个非零元进行转置*/
for(p=1;p<=A.tu;++p)
{
col=A.data[p].col;
q=cpot[col];
B.data[q].row=A.data[p].col;
B.data[q].col=A.data[p].row;
B.data[q].e=A.data[p].e;
++cpot[col];
}
}
}
/*稀疏矩阵的输出*/
void printfx(TSMatrix x)
{
int i,j;
for(j=1;j<=x.tu;j++)
{
for(i=1;i<=x.mu;i++)
if(x.data[j].row==i)printf("%d %d %d/n",x.data[j].row,x.data[j].col,x.data[j].e );
}
}
main.cpp 文件
#include
#include'"sanyuanzu.cpp"
//主函数
int main(void)
{
TSMatrix t,s;
creat(t);
printf("你所输入的稀疏矩阵为:/n");
printfx(t);
fasttrans(t,s);
printf("转置后的稀疏矩阵为:/n");
printfx(s);
return 0;
}
}
七、调试报告