稀疏矩阵的乘法运算 | C++ | 稀疏矩阵

一、题目描述

数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。

本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

输入

第1个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

第2个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组
   

以行为主序输入稀疏矩阵三元组表

扫描二维码关注公众号,回复: 15064550 查看本文章

输出

       乘积矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 3↵
  2. 4↵
  3. 4↵
  4. 1 1 3↵
  5. 1 4 5↵
  6. 2 2 -1↵
  7. 3 1 2↵
  8. 4↵
  9. 2↵
  10. 4↵
  11. 1 2 2↵
  12. 2 1 1↵
  13. 3 1 -2↵
  14. 3 2 4↵
以文本方式显示
  1. 3↵
  2. 2↵
  3. 3↵
  4. 1,2,6↵
  5. 2,1,-1↵
  6. 3,2,4↵
1秒 256KB 0

二、思路分析

1、读入稀疏矩阵A。

2、读入稀疏矩阵B。

3、计算矩阵C。

4、输出C。


完整代码

#include<bits/stdc++.h> 
using namespace std;
const int N = 10010;

typedef struct {
	int row, col, data;
} elem;
typedef struct {
	elem *element = (elem*) malloc ( N*sizeof(elem) ) ;
	int ROW, COL, NZRO=0;
} Triplet;

//输出
void printC(Triplet C) {
	printf("%d\n%d\n%d\n",C.ROW,C.COL,C.NZRO);
	for (int i=0; i<C.ROW*C.COL; i++) {
		if (C.element[i].data!=0) {
			printf("%d,%d,%d\n",C.element[i].row+1,C.element[i].col+1,C.element[i].data);
		}
	}
}


int main(){
	
	void printC(Triplet);
	Triplet A,B,C;

	//第一个稀疏矩阵A
	scanf("%d %d %d",&A.ROW,&A.COL,&A.NZRO);
	for (int i=0; i<A.NZRO; i++) {
		scanf("%d %d %d",&A.element[i].row,&A.element[i].col,&A.element[i].data);
		A.element[i].row--; A.element[i].col--;
	}
    //补充说明:题目读入的矩阵下标从1开始,而我是从0开始,所以这里对row和col都进行-1的操作。下面的B同理。

	//第二个稀疏矩阵B
	scanf("%d %d %d",&B.ROW,&B.COL,&B.NZRO);
	for (int i=0; i<B.NZRO; i++) {
		scanf("%d %d %d",&B.element[i].row,&B.element[i].col,&B.element[i].data);
		B.element[i].row--; B.element[i].col--;
	}

	//第三个矩阵C
	C.ROW = A.ROW;	C.COL = B.COL;  
	
    //初始化第三个矩阵 
	for (int i=0; i<C.ROW; i++) {
		for (int j=0; j<C.COL; j++) {
			C.element[ i*C.COL+j ].data = 0;
			C.element[ i*C.COL+j ].row  = i; 
			C.element[ i*C.COL+j ].col  = j;
		}
	}

    //计算过程在这里
	for (int i=0; i<A.NZRO; i++) {
		for (int j=0; j<B.NZRO; j++) {
			int d = 0;
			if (A.element[i].col==B.element[j].row) 
				d = A.element[i].data * B.element[j].data; //d是乘法计算的结果
			
			//如果d不为0,则将其加到相应的位置上
			if (d!=0) {
				C.element[ A.element[i].row*C.COL+B.element[j].col ].data += d; 
				if ( C.element[A.element[i].row*C.COL+B.element[j].col].data==0 ) C.NZRO--;
				else if ( C.element[A.element[i].row*C.COL+B.element[j].col].data==d ) C.NZRO++;
			}
		}
	}
	
	printC(C);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_70241024/article/details/127143876