#include<iostream>
#include<stdio.h>
#include<math.h>
#define SIZE 5
using namespace std;
int* Compress(int *m) {
int*n = (int*)malloc(sizeof(int)*(SIZE*(SIZE+1)/2));
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++, k++) {
if (i >= j)k = i*(i + 1) / 2 + j;
else k = j*(j + 1) / 2 + i;
n[k] = m[i*SIZE+j];
}
}
return n;
}
int* Decompress1(int* n) {
int * m = (int*)malloc(sizeof(int)*SIZE*SIZE);
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < SIZE; i++) {
for (j = 0; j <= i; j++) {
if (i >= j)k = i*(i + 1) / 2 + j ;
else k = j*(j + 1) / 2 + i;
m[j*SIZE+i] = m[i*SIZE+j] = n[k];
}
}
return (int*)m;
}
int * Decompress2(int* n) {
int * m = (int*)malloc(sizeof(int)*SIZE*SIZE);
int i = 0;
int j = 0;
int k = 0;
for (k = 0; k < (SIZE*(SIZE + 1) / 2); k++) {
for (i = 0; (i + 1)*(i + 2) / 2 < k + 1; i++);
j = k - i*(i + 1) / 2;
m[j*SIZE+i] = m[i*SIZE + j] = n[k];
}
return m;
}
int * Decompress3(int * n) {
int * m = (int*)malloc(sizeof(int)*SIZE*SIZE);
int i = 0;
int j = 0;
int k = 0;
for (k = 0; k < (SIZE)*(SIZE + 1) / 2; k++) {
i =ceil( sqrt(2*k*1.0 + 2.25) - 1.5);
j = k - i*(i + 1) / 2;
m[j*SIZE + i] = m[i*SIZE + j] = n[k];
}
return m;
}
int main() {
int p[SIZE][SIZE] = { 1,5,1,3,7,5,0,8,0,0,1,8,9,2,6,3,0,2,5,1,7,0,6,1,3};
printf("压缩前:\n");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
printf("%d ", p[i][j]);
printf("\n");
}
int* p1 = Compress((int*)p);
printf("压缩后:\n");
for (int i = 0; i < (SIZE*(SIZE + 1) / 2); i++)printf("%d ", p1[i]);
printf("\n");
printf("解压前:\n");
for (int i = 0; i < (SIZE*(SIZE + 1) / 2); i++)printf("%d ", p1[i]);
printf("\n");
printf("解压后:\n");
int* p2 = Decompress1((int*)p1);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
printf("%d ", p2[i*SIZE+j]);
printf("\n");
}
printf("解压后:\n");
p2 = Decompress2((int*)p1);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
printf("%d ", p2[i*SIZE + j]);
printf("\n");
}
printf("解压后:\n");
p2 = Decompress3((int*)p1);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
printf("%d ", p2[i*SIZE + j]);
printf("\n");
}
}
对称矩阵压缩和三种解压缩方式
猜你喜欢
转载自blog.csdn.net/realfancy/article/details/78824414
今日推荐
周排行