稀疏矩阵(算法与数据结构课程设计)

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

稀疏矩阵

一、问题描述

假若在n m ⨯阶中,有t 个元素不为零,令n

m t ⨯=δ称为矩阵的稀疏因子。通常认为≤δ0.05时称为稀疏矩阵。稀疏矩阵的研究大大的减少了数据在计算机中存储所需的空间,然而,它们的运算却与普通矩阵有所差异。通过本次实验实现稀疏矩阵的转置、加法和乘法等多种运算。

二、基本要求

1、稀疏矩阵采用三元组表示,建立稀疏矩阵,并能按矩阵和三元组方式输出;

2、编写算法,完成稀疏矩阵的转置操作;

3、编写算法,完成对两个具有相同行列数的稀疏矩阵进行求和操作;

4、编写算法,对前一矩阵行数与后一矩阵列数相等的两个矩阵,完成两个稀疏矩阵的相乘操作。

三、测试数据

1、转置操作的测试数据:

⎪⎪⎪⎪⎪⎭⎫ ⎝

⎛00200013000010020100 2、相加操作的测试数据: ⎪⎪⎪⎪⎪⎭⎫ ⎝

⎛002000130000100

20100 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200010000210030300 3、相乘操作的测试数据: ⎪⎪⎪⎪⎪⎭

⎫ ⎝⎛000000030040

0021 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛001002000021 四、算法思想

1、三元组结构类型为Triple ,用i 表示元素的行,j 表示元素的列,e 表示元素值。稀疏矩阵的结构类型为TSMatrix ,用数组data[]表示三元组,mu 表示行数,nu 表示列数,tu 表示非零元个数。

2、稀疏矩阵转置的算法思想

将需要转置的矩阵a 所有元素存储在三元组表a.data 中,按照矩阵a 的列序来转置。

为了找到a的每一列中所有非零元素,需要对其三元组表a.data扫描一遍,由于a.data 是以a的行需序为主序来存放每个非零元的,由此得到的就是a的转置矩阵的三元组表,将其储存在b.data中。

3、稀疏矩阵相加的算法思想

比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。

4、稀疏矩阵相乘的算法思想

两个相乘的矩阵为M与N,对M中每个元素M.data[p](p=1,2,…,M.tu),找到N中所有满足条件M.data[p].j=N.data[q].i的元素N.data[q],求得M.data[p].v和N.data[q].v 的乘积,又T(i,j)=∑M(i,k)×N(k,j),乘积矩阵T中每个元素的值是个累计和,这个乘积M.data[p].v×N.data[q].v只是T[i][j]中的一部分。为便于操作,应对每个元素设一累计和的变量,其初值是零,然后扫描数组M,求得相应元素的乘积并累加到适当的求累计和的变量上。由于T中元素的行号和M中元素的行号一致,又M中元素排列是以M的行序为主序的,由此可对T进行逐行处理,先求得累计求和的中间结果(T的一行),然后再压缩存储到Q.data中去。

五、模块划分

1、Status CreateM(TSMatrix *M, int a[],int row, int col),创立三元组;

2、void PrintM(TSMatrix M),按数组方式输出;

3、void PrintM3(TSMatrix M),按三元组方式输出;

4、Status TransposeSMatrix(TSMatrix M, TSMatrix *T),稀疏矩阵的转置;

5、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵加法;

6、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵相乘;

7、main(),主函数。

六、数据结构//(ADT)

1、三元组结构类型

typedef struct

{ int i,j;

ElemType e;

} Triple;

2、稀疏矩阵

typedef struct

{ Triple data[MAXSIZE+1];

int mu,nu,tu;

} TSMatrix;

七、源程序

#include "stdio.h"

#define OK 1

#define TRUE 1

#define FALSE 0

typedef int Status;

typedef int ElemType;

/* 三元组顺序表的类型定义 */

#define MAXSIZE 1000

#define MAXRC 1000

typedef struct

{ int i,j;

ElemType e;

} Triple;

typedef struct

{ Triple data[MAXSIZE+1];

int mu,nu,tu;

} TSMatrix;

/* 建立三元组表 */

Status CreateM(TSMatrix *M, int a[],int row, int col)

{ int i,k=0;

for(i=0;i

if (a[i]!=0)

{++k;

(*M).data[k].i=i/col+1;

(*M).data[k].j=i%col+1;

(*M).data[k].e=a[i];

}

if (k)

{ (*M).tu=k; (*M).mu=row; (*M).nu=col; return TRUE; } else

return FALSE;

}

/* 按数组方式输出三元组表 */

void PrintM(TSMatrix M)

{int k=1,p=1,n;

printf("\nM:\n");

相关文档
最新文档