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

【问题描述】

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

0   0   0   10    0 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
0 3 10
1 0 2
2 2 3
2 3 1
3 0 1
2
0 1 200
2 2 -5

【输出样例】

 

1 1 400
2 2 -15
3 1 200

【样例说明】

输入的两个矩阵中的行、列最大下标均为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;
}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值