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