稀疏矩阵的建立与转置

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

}

七、调试报告

相关文档
最新文档