稀疏矩阵的乘法实现

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

稀疏矩阵的乘法实现

程序:

1# include

2# include

3# define NULL 0

4# define OK 1

5# define ERROR 0

6# define MAXSIZE 100 /* 矩阵中非零元的最大值 */

7# define MAXRC 10 /* 矩阵的最大行值 */

8

9typedef int status ;

10

11 /********** 稀疏矩阵的行逻辑链接的顺序表存储表示 **********/

12

13typedef struct /* 非零元的三元组 */

14{

15int i, j ; /* 非零元的行下标和列下标 */

16int e ;

17}Triple;

18

19typedef struct /* 稀疏矩阵的行逻辑链接的顺序表 */

20{

21 Triple data[MAXSIZE+1]; /* 非零三元组表,data[0]

未用,以下定义的数组都是从1开始 */

22int rpos[MAXRC+1]; /* 代表各行第一个非零元的序号表,其值为data的下标 */

23int mu,nu,tu; /* 矩阵的行数、列数、非零元的个数 */

24}RLSMatrix; /* R:row L:logic S:sequence */

25

26

27 /********* 基本操作的函数原型的声明 *********/

28

29status CreateSMatrix_RL(RLSMatrix * matrix);

30// 创建一个稀疏矩阵;

31// 输入行数、列数,支持乱序输入三元组,并计数;

32// 以行为主序进行重新排列,并记录每行起始位置于

matrix->rpos[row];

33// 若非零元超过 MAXSIZE或行数超过MAXRC,则返回ERROR,否则OK;

34

35void PrintSMatrix_RL(RLSMatrix * matrix);

36// 输入矩阵,打印出矩阵的行数、列数、非零元个数,以及整个矩阵;

37

38status MultSMatrix_RL(RLSMatrix * M,RLSMatrix *

N,RLSMatrix * Q);

39// 输入两个稀疏矩阵M和N,并初始化Q,然后计算M*N的值赋给Q;

40// 如果M->mu!=N->nu或列数大于MAXRC或者计算出的非零元个数大于MAXSIZE,都返回ERROR,否则OK;

41// 计算过程如下:

42// 1. 由于矩阵M和Q的行数相等并且C语言以行为主序进行存储,所以以M进行逐行的扫描。

43// 2. 使Q的此行逻辑表的序号等于其非零元个数Q.tu+1,以表示其行的首个元素的序号。

44// 3. 从行中找到M的非零元,并以它的列值为N的行号,对N 进行行的扫描,若存在,则依次计算它们,并把其值累加到一个以N中这个对应非零元的列值为序号的临时数组ctemp[ccol]中。

45// 4. 在M的当前行完成扫描后,将ctemp[ccol]不为0的值,压入到Q矩阵的三元组,累加++Q.tu,若Q.tu大于了MAXSIZE,这返回ERROR。

46

47/************ main( ) 函数对矩阵乘法的实现 ************/ 48

49void main()

50{

51 RLSMatrix * M,* N,* Q;

52if(!(M=(RLSMatrix *)malloc(sizeof(RLSMatrix)))) 53 exit(ERROR);

54if(!(N=(RLSMatrix *)malloc(sizeof(RLSMatrix))))

55 exit(ERROR);

56if(!(Q=(RLSMatrix *)malloc(sizeof(RLSMatrix))))

57 exit(ERROR);

58if(CreateSMatrix_RL(M)&&CreateSMatrix_RL(N))

59 {

60 printf("/nput out M:/n");

61 PrintSMatrix_RL(M); /* 打印出M */

62 printf("/nput out N:/n");

63 PrintSMatrix_RL(N); /* 打印出N */

64if(MultSMatrix_RL(M,N,Q))

{

66 printf("/n/n/n M * N :/n");

67 PrintSMatrix_RL(Q); /* 计算结果

*/

68 }

69else

70 printf("M.mu and N.nu are not mathing/n");

71 }

72else

73 printf("input error./n");

74}

75

76

77/*********** 基本操作的算法描述 ****************/

78

79status CreateSMatrix_RL(RLSMatrix * matrix)

80// 创建一个稀疏矩阵;

81// 输入行数、列数,支持乱序输入三元组,并计数;

82{

83int num=0,p,q,min,temp; // 中间变量;

84int row;

85 printf("input the total row and col:/n");

86 scanf("%d%d",&matrix->mu,&matrix->nu); //

输入行数、列数;

87if(matrix->mu>MAXRC)

88return ERROR;

89 printf("row col val/n");

90

scanf("%d%d%d",&matrix->data[num+1].i,&matrix->data[num+1].j

相关文档
最新文档