-
稀疏矩阵:如果在矩阵中,多数的元素为0,通常认为非零元素比上矩阵所有元素的值小于等于0.05时,则称此矩阵为稀疏矩阵(sparse matrix)。
- 你可能会想到用二维数组来存放此矩阵中的元素,就像这样:int text[][5] = {{0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}};
- 这样好像也没有什么不好。我们再来看看这个矩阵,五行五列,可以包含二十五个元素,但是此矩阵只有七个元素。
-
但是我们在存放数据的时候分配了二十五块int单元。这样是不是有点太浪费了。如果我们只存储这七个元素我想会节省一部分内存空间。
-
但是如果我们只存储矩阵中的元素还是不行的,因为只有元素我们就无法还原矩阵,我们还需要此元素的行列值。
typedef struct matrix
{
int row; //行
int col; //列
int value; //元素值
};
- 定义两个数组,一个用来存储稀疏矩阵,一个用来存储转置过后的矩阵:
struct matrix a[MAX_TERM]; //存放矩阵中元素数值不为零的元素
struct matrix b[MAX_TERM]; //转置后的矩阵
int initialize(struct matrix a[MAX_TERM]) //初始化稀疏矩阵
{
int i,j;
int count_a = 1;
for(i = 0;i < N;i++)
{
for(j = 0;j < N;j++)
{
if(text[i][j] != 0)
{
a[count_a].row = i;
a[count_a].col = j;
a[count_a].value = text[i][j];
count_a++;
}
}
}
a[0].col = 5; //矩阵的总列数
a[0].row = 5; //矩阵的总行数
a[0].value = --count_a; //矩阵中的元素个数
return count_a;
}
void showmatrix_1(struct matrix a[MAX_TERM],int count_a) //打印未经压缩的矩阵
{
int i,j;
int text = 1;
for(i = 0;i < N;i++)
{
for(j = 0;j < N;j++)
{
if(a[text].row == i && a[text].col == j)
{
printf(" %d ",a[text].value);
text++;
}
else
printf(" 0 ");
}
printf("\n");
}
}
void showmatrix_2(struct matrix a[MAX_TERM],int count_a) //显示稀疏矩阵方
{
int i;
printf(" i row col val\n");
for(i = 0;i < count_a + 1;i++)
{
printf(" %d| %d %d %d\n",i,a[i].row,a[i].col,a[i].value);
}
}
void reversal(struct matrix a[MAX_TERM],struct matrix b[MAX_TERM]) //转置矩阵并打印
{
int i,j;
int count_b = 1; //b的当前元素下标
b[0].row = a[0].col;
b[0].col = a[0].row;
b[0].value = a[0].value;
for(i = 0;i < a[0].col;i++)
{
for(j = 1;j <= a[0].value;j++)
{
if(a[j].col == i)
{
b[count_b].row = a[j].col;
b[count_b].col = a[j].row;
b[count_b].value = a[j].value;
count_b++;
}
}
}
for(i = 0;i < a[0].value + 1;i++)
printf(" %d| %d %d %d\n",i,b[i].row,b[i].col,b[i].value);
}
#include<stdio.h>
#define N 5
#define MAX_TERM 15
typedef struct matrix
{
int row; //行
int col; //列
int value; //元素值
};
int text[5][5] = {{0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}};//用二维数组存储矩阵的初始值
struct matrix a[MAX_TERM]; //存放矩阵中元素数值不为零的元素
struct matrix b[MAX_TERM]; //转置后的矩阵
int initialize(struct matrix a[MAX_TERM]) //初始化稀疏矩阵
{
int i,j;
int count_a = 1;
for(i = 0;i < N;i++)
{
for(j = 0;j < N;j++)
{
if(text[i][j] != 0)
{
a[count_a].row = i;
a[count_a].col = j;
a[count_a].value = text[i][j];
count_a++;
}
}
}
a[0].col = 5; //矩阵的总列数
a[0].row = 5; //矩阵的总行数
a[0].value = --count_a; //矩阵中的元素个数
return count_a;
}
void showmatrix_1(struct matrix a[MAX_TERM],int count_a) //打印稀疏矩阵
{
int i,j;
int text = 1;
for(i = 0;i < N;i++)
{
for(j = 0;j < N;j++)
{
if(a[text].row == i && a[text].col == j)
{
printf(" %d ",a[text].value);
text++;
}
else
printf(" 0 ");
}
printf("\n");
}
}
void showmatrix_2(struct matrix a[MAX_TERM],int count_a) //显示稀疏矩阵方
{
int i;
printf(" i row col val\n");
for(i = 0;i < count_a + 1;i++)
{
printf(" %d| %d %d %d\n",i,a[i].row,a[i].col,a[i].value);
}
}
void reversal(struct matrix a[MAX_TERM],struct matrix b[MAX_TERM]) //转置矩阵方法一
{
int i,j;
int count_b = 1; //b的当前元素下标
b[0].row = a[0].col;
b[0].col = a[0].row;
b[0].value = a[0].value;
for(i = 0;i < a[0].col;i++)
{
for(j = 1;j <= a[0].value;j++)
{
if(a[j].col == i)
{
b[count_b].row = a[j].col;
b[count_b].col = a[j].row;
b[count_b].value = a[j].value;
count_b++;
}
}
}
for(i = 0;i < a[0].value + 1;i++)
printf(" %d| %d %d %d\n",i,b[i].row,b[i].col,b[i].value);
}
int main(void)
{
int count_a;//记录非0元素的个数
count_a = initialize(a);//初始化矩阵 ,并统计非0的元素个数
printf("打印原矩阵\n");
showmatrix_1(a,count_a);//显示原矩阵
printf("\n显示压缩矩阵\n");
showmatrix_2(a,count_a);//显示压缩矩阵
putchar('\n');
printf("转置过后的矩阵\n") ;
reversal(a,b);
printf("\n");
return 0;
}