稀疏矩阵压缩

发布时间 2023-12-05 08:40:00作者: 耿集

c代码

#include <stdio.h>
#define MaxSize 128
#define M 6
#define N 7 
#define ERROR 0
#define OK 1

typedef int Status;

typedef struct
{
    int i;                  //行号
    int j;                  //列号
    int v;             //元素值
} TupNode;                  //三元组定义

typedef struct
{
    int rows;               //行数
    int cols;               //列数
    int nums;               //非零元素个数
    TupNode data[MaxSize + 1]; // 第0个位置不用 
} TSMatrix;

// 输出矩阵
Status ShowA(int A[M][N]){
	for(int i = 0; i < M; i++){
		for(int j = 0; j < N; j++){
			printf("%d\t", A[i][j]);
		}
		printf("\n\n");
	}
	return OK;
} 

// 矩阵转三元组 
Status CreatMat(TSMatrix &t, int A[M][N]){
	// 行数与列数 
	t.rows = M;
	t.cols = N;
	// 计算非0元素个数, 也可当作三元组的下标 
	t.nums = 0;
	// 遍历矩阵
	for(int i = 0; i < M; i++){
		for(int j = 0; j < N; j++){
			// 存储非0元素
			if(A[i][j] != 0){
				// 提前+1,三元表第0个位置不使用
				t.nums++;
				// 存储矩阵值 
				t.data[t.nums].i = i + 1;
				t.data[t.nums].j = j + 1;
				t.data[t.nums].v = A[i][j]; 
			} 
		}
	}
	return OK;
}

// 输出三元组
Status ShowMat(TSMatrix t){
    if(t.nums <= 0) return ERROR;
    printf("(\n");
    for(int i = 1; i <= t.nums; i++)
        printf("(%d, %d, %d)\n", t.data[i].i, t.data[i].j, t.data[i].v);
    printf(")\n");
    return OK;
}

// 矩阵转置
int TransposeMat(TSMatrix Mat, TSMatrix &TMat){
	// 控制新三元组的下标位置
	int q = 0; 
	// 行列调换
	TMat.rows = Mat.cols;
	TMat.cols = Mat.rows;
	TMat.nums = Mat.nums;
	// 如果三元组没有值就退出
	if(Mat.nums <= 0) return ERROR;
	// 转置
	for(int i = 0; i < TMat.rows; i++){
		for(int p = 1; p <= Mat.nums; p++){
			if(Mat.data[p].j == i + 1){
				q++;
				TMat.data[q].i=Mat.data[p].j;
				TMat.data[q].j=Mat.data[p].i;
				TMat.data[q].v=Mat.data[p].v;
			}
		}
	}
	return OK;
} 

int task9(){
	TSMatrix Mat, TMat;
	// 初始矩阵
	int A[M][N] = {
		{0, 12, 9, 0, 0, 0, 0},
		{0, 0, 0, 0, 0, 0, 0},
		{-3, 0, 0, 0, 0, 14, 0},
		{0, 0, 24, 0, 0, 0, 0},
		{0, 18, 0, 0, 0, 0, 0},
		{15, 0, 0, -7, 0, 0, 0}
	};
	printf("-------------------初始矩阵-------------------\n");
	ShowA(A);
	// 压缩矩阵(行优先)
	CreatMat(Mat, A);
	printf("------------------- 压缩后 -------------------\n");
	ShowMat(Mat);
	printf("-------------------转置矩阵-------------------\n");
	int B[N][M];
	for(int i = 0; i < N; i++){
		for(int j = 0; j < M; j++){
			B[i][j] = 0;
		}
	}
	for(int i = 1; i <= Mat.nums; i++){
		B[Mat.data[i].j - 1][Mat.data[i].i - 1] = Mat.data[i].v;
	}
	for(int i = 0; i < N; i++){
		for(int j = 0; j < M; j++){
			printf("%d\t", B[i][j]);            
		}
		printf("\n\n");
	}
	printf("------------------- 转置后 -------------------\n");
	// 矩阵转置(行优先)
	TransposeMat(Mat, TMat); 
	ShowMat(TMat);
}