稀疏矩阵基本操作实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

稀疏矩阵基本操作实验报告

一、实验内容

稀疏矩阵的压缩储存结构,以及稀疏矩阵的三元组表表示方法下的转置、相加、相

乘等算法

二、实验目的

1. 熟悉数组、矩阵的定义和基本操作

2. 熟悉稀疏矩阵的储存方式和基本运算

3. 理解稀疏矩阵的三元组表类型定义,掌握稀疏矩阵的输入、输出和转置算法

三、实验原理

1. 使用三元组储存矩阵中的非零元素(三元组分别储存非零元素的行下标,列下标和

元素值)。除了三元组表本身,储存一个稀疏矩阵还需要额外的三个变量,分别储

存矩阵的非零元个数,矩阵的行数和矩阵的列数。

2. 稀疏矩阵的创建算法:

第一步:根据矩阵创建一个二维数组,表示原始矩阵

第二步:取出二维数组中的元素(从第一个元素开始取),判断取出元素是否为非零元素,如果为非零元素,把该非零元素的数值以及行下标和列下表储存到三元数

组表里,否则取出下一个元素,重复该步骤。

第三步:重复第二步,知道二维数组中所有的元素已经取出。

3. 稀疏矩阵倒置算法:

第一步:判断进行倒置的矩阵是否为空矩阵,如果是,则直接返回错误信息。

第二步:计算要倒置的矩阵每列非零元素的数量,存入到num 数组(其中num[i] 代表矩阵中第i 列非零元素的个数)。以及倒置后矩阵每行首非零元的位置,存入cpot 数组中(其中cpot 表示倒置后矩阵每行非零元的位置,对应表示原矩阵每列中第

一个非零元的位置)。

第三步:确定倒置后矩阵的行数和列数。

第四步:取出表示要导致矩阵中三元组表元素{e, I, j} (第一次取出第一个,依次取出下一个元素),从第二步cpot 数组中确定该元素倒置后存放的位置(cpot[j] ),把该元素的行下标和列下标倒置以后放入新表的指定位置中。cpot[j] 变量加一。

第五步:重复第四步,直到三元组表中所有的元素都完成倒置。

第六步:把完成倒置运算的三元组表输出。

4. 稀疏矩阵加法算法:

第一步:检查相加两个矩阵的行数和列数是否相同,如果相同,则进入第二步,否

则输出错误信息。

第二步:定义变量i 和j,用于控制三元组表的遍历。

第三步:比较变量矩阵M 中第i 个元素和矩阵N 中第j 个元素,如果两个元素是同一行元素,如果不是则进入第四步,如果是,再继续比较两个元素是否为同一列元

素,如果是,把两个元素值相加,放到三元组表中;否则把列下表小的元素依次放

到三元组表中。进入第五步

第四步:如果矩阵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

#include

#include

#define MAXSIZE 1000

#define OK 0

#define MALLOC_FAIL -1 // 表示分配空间时发生错误

#define EMPTY_MATRIX -2 // 表示正尝试对一个空矩阵进行运算操作

#define MATRIX_NOT_MATCH -3 // 表示尝试对不符合运算条件的矩阵进行运算操作(例如非相同行数列数矩阵相加)

/* ----------- 结构体声明部分------------- */

typedef struct

{

int row; // 非零元的行下标

int col; // 非零元的列下标

int e; // 非零元的值

} Triple;

typedef struct

{

Triple *data; // 非零元素的元素表

int rownum; // 矩阵的行数

int colnum; // 矩阵的列数

int num; // 矩阵非零元的个数

} TSMatrix, *PTSMatrix;

相关文档
最新文档