现有一个5×5的对称矩阵,用C语言来实现对称矩阵的压缩与解压缩,这里我们对下三角进行存储,即可完成矩阵的压缩。
代码执行结果
C代码实现
//
// Created by wtk on 22-11-30.
//
#include <stdio.h>
/**
* 对称矩阵压缩算法:传入一个对称矩阵,返回压缩后的一维数组
* @param matrix_table 矩阵
* @param compress 用来接收压缩结果的一维数组
* @param len 一维数组的长度
*/
void symmetric_matrix_compression(int matrix_table[5][5], int *compress, int len){
//矩阵的行数量
int row_count = 5;
//进行压缩
//按行循环
for(int i = 0; i < row_count; i++){
//每行需要压缩的列
for(int k = 0; k <= i; k++){
int index = (i+1)*i/2 + k;
compress[index] = matrix_table[i][k];
}
}
//打印压缩结果
printf("压缩结果:\n");
printf("[");
for(int i = 0; i < len; i++){
if(i == len-1){
printf("%d", compress[i]);
} else{
printf("%d, ", compress[i]);
}
}
printf("]\n");
}
/**
* 对称矩阵解压缩算法:传入一个对称矩阵压缩后得到的一维数组,解压缩成对称矩阵
* @param compress
* @param size 矩阵的行数和列数 [行数,列数]
*/
void symmetric_matrix_decompression(int* compress, int size[2]){
int row_count = size[0];
int column_count = size[1];
//定义矩阵
int matrix[row_count][column_count];
//解压缩
//按行循环
for(int i = 0; i < row_count; i++){
//每行存储的列数
for(int k = 0; k <= i; k++){
int index = (i+1)*i/2 + k;
matrix[i][k] = compress[index];
matrix[k][i] = matrix[i][k];
}
}
//打印
printf("解压结果:\n");
for(int i = 0; i<row_count; i++){
for(int k = 0; k<row_count; k++){
printf("%d\t\t", matrix[i][k]);
}
printf("\n\n");
}
}
int main(){
int data[5][5] = {
{1,2,3,4,5},
{2,4,6,8,7},
{3,6,5,5,4},
{4,8,5,6,8},
{5,7,4,8,5}
};
//计算压缩户的一维数组长度
int compress_len = (5+1)*5/2;
//定义存放压缩结果的一维数组
int compress_result[compress_len];
//进行压缩
symmetric_matrix_compression(data,compress_result, compress_len);
int size[2] = {5,5};
symmetric_matrix_decompression(compress_result, size);
return 0;
}