三元组实现稀疏矩阵的相乘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三元组实现稀疏矩阵的相乘
学院:
班级:
姓名:
学号:
一、实验题目:
建立三元组,并以三元组为储存结构储存两个稀疏矩阵,并实现他们的相乘,输出结果。
二、需求分析:
定义一个一维数组,它用来以行序为主序依次存放所有非零元构成的三元组,并定义变量分别记录矩阵的行数、列数非零元个数以及数组大小。按照这种方式定义三元组的数据实现两个稀疏矩阵的乘法操作。
三、概要设计:
建立一个三元组的结点:
struct Node
{
int Row,Col; // 三元组Á的行列号?
int Value; // 元素的值
};
用以储存稀疏矩阵,建立A和B两个稀疏矩阵用三元组表来储存非零元的行数、列数、值,再相乘输出结果。
四、详细设计:
建立三元组:
struct Node
{
int Row,Col; // 三元组Á的行列号?
int Value; // 元素的值
};
建立三元组表:
struct SparMatrix
{
int Rows,Cols; // 矩的行列数
int Terms; // 矩阵的非零元个数
struct Node arrayData[MAX_SIZE]; // 存放矩阵非零元素的三元组数组
void PrintMatrix(); // 输出矩阵
int GetElement(int m ,int n); // 获得矩阵对应的元素
void PrintInit(); // 矩阵的输初始化
void AddElement(int m,int n, int Value); // 增加非零元素
};
矩阵相乘:
SparMatrix* MatrixMulti(SparMatrix* pM1,SparMatrix* pM2);
void main()
{
SparMatrix matrix1;
cout<<"The 1st matrix:"< matrix1.PrintInit(); SparMatrix matrix2; cout<<"The 2nd matrix:"< matrix2.PrintInit(); cout<<"Multiplication:"< matrix1.PrintMatrix(); cout<<"*"< matrix2.PrintMatrix(); cout<<"="< SparMatrix* pMatrixPro; pMatrixPro = MatrixMulti(&matrix1,&matrix2); if (pMatrixPro == NULL) { cout<<"Error!"< } else { pMatrixPro->PrintMatrix(); } if (pMatrixPro != NULL) { delete pMatrixPro; pMatrixPro = NULL; } } 五、程序使用说明: 首先会看到“Please input the row and col num, using space to separate them:”的字样,这时候请输入你所要建立稀疏矩阵行数列数。敲回车出现“Please input the 1 element. * to end:”的字样,输入非零元的值敲回车出现“Then input the row and col of this element, using space to separate them:”,输入此非零元的行数、列数。输入完后敲“*”回车,再敲下一组矩阵。最后输出结果。 六、运行过程: 开始 建立一个4*4的矩阵 输入非零元 输入第二个矩阵重复上诉操作。 七、总结: 按照稀疏矩阵压缩存储的思想,当矩阵的阶数比较高时,为了节省存储空间,对于稀疏矩阵,没有必要使用专门的存储单元将大量的零元素存放起来,只需要存放非零元矩阵元素。为了记下矩阵元素之间的逻辑关系,若要存放一个非零矩阵元素,必须同时存放3个信息,即该元素的行数、列数、值。矩阵元素的这3个信息构成了一个三元组。一个非零元的三元组唯一确定了一个非零的矩阵元素,而稀疏矩阵可以由所有非零元组以及矩阵的行数和列数唯一确定。