200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 稀疏矩阵乘法运算(C语言)

稀疏矩阵乘法运算(C语言)

时间:2018-09-11 14:34:20

相关推荐

稀疏矩阵乘法运算(C语言)

【问题描述】

稀疏矩阵可以以压缩方式进行存储,即:用一个n行3列矩阵只存储非零元素。每行存储一个非零元素,每行第一个为非零元素行标;第二个为非零元素列标;第三个为非零元素本身。如下左边为一个稀疏矩阵,右边是其存储形式。编写程序实现用上述压缩存储方式输入的稀疏矩阵的乘法,稀疏矩阵最大为9*9。以压缩方式输出结果矩阵。行标和列标都从0开始计数。

0 0 0 100 3 10

2 0 0 0 1 0 2

0 0 3 1 2 2 3

1 0 0 0 2 3 1

3 0 1

【输入形式】

先从控制台输入第一个矩阵的非零元素个数,再以压缩方式输入第一个矩阵的元素,即:分行输入非零元素的行标、列标和非零元素数据本身,以一个空格分隔行标、列标和非零元素。然后以同样方式输入第二个矩阵。

【输出形式】

在标准输出上以压缩方式分行输出结果矩阵,即:每行分别输出结果矩阵中非零元素的行标、列标和非零元素数据本身,行标、列标和非零数据之间以一个空格分隔,但每行最后一个数据后没有空格。先输出行标小的元素,若行标相同,则先输出列标小的元素。若没有非零元素,则不输出任何信息。

【输入样例】

5

0310

102

223

231

301

2

01200

22-5

【输出样例】

11400

22-15

31200

【样例说明】

输入的两个矩阵中的行、列最大下标均为3,所以可以看成是4*4的矩阵,即输入的两个矩阵分别为:

0 0 0 10

2 0 0 0

0 0 3 1

1 0 0 0

0 200 0 0

0 0 0 0

0 0 -5 0

0 0 0 0

两矩阵相乘的结果为:

0 0 0 0

0 400 0 0

0 0 -15 0

0 200 0 0

#include <stdio.h>#include <stdlib.h>#define maxn 15//定义节点typedef struct node {int row, col, v;} node;//定义三元组存储稀疏矩阵struct T {node Node[maxn];int MAXrow, MAXcol, MAXsize;} TA, TB, TC;int main() {int num1,num2,i,j,k,sum,p,q;scanf("%d", &num1);//输入a矩阵TA.MAXsize = num1;for(i=0;i<num1;i++){scanf("%d%d%d",&TA.Node[i].row,&TA.Node[i].col,&TA.Node[i].v);}TA.MAXrow = maxn;TA.MAXcol = maxn;scanf("%d", &num2);//输入b矩阵TB.MAXsize = num2;for(k=0;k<num2;k++){scanf("%d%d%d",&TB.Node[k].row,&TB.Node[k].col,&TB.Node[k].v);}TB.MAXrow = maxn;TB.MAXcol = maxn;TC.MAXsize = 0;TC.MAXrow = maxn;TC.MAXrow = maxn;for(i = 0; i < maxn; i++) {//计算c矩阵for(j = 0; j < maxn; j++) {sum = 0;for(p = 0; p < TA.MAXsize ; p++) {if(TA.Node[p].row != i) continue;for(q = 0; q < TB.MAXsize; q++) {if(TB.Node[q].col != j) continue;if(TA.Node[p].col == TB.Node[q].row) {sum += TA.Node[p].v * TB.Node[q].v;}}}if(sum != 0) {TC.Node[TC.MAXsize].row = i;TC.Node[TC.MAXsize].col = j;TC.Node[TC.MAXsize].v = sum;TC.MAXsize++;}}}for(i=0;i<TC.MAXsize;i++){printf("%d %d %d\n",TC.Node[i].row,TC.Node[i].col,TC.Node[i].v);}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。