
对于矩阵这样由n行n列构成的数据集合,可以通过二维数组来进行存储。
在实际工程中也会用到一些特殊的矩阵, 特殊矩阵可以“压缩”的一种思维来降低空间需求。
(1)对角矩阵
(2)对称矩阵
(3)上三角矩阵/下三角矩阵
1. 对称矩阵的压缩存储

若一个n阶方阵A[n][n]中的元素满足aij=aji(0≤i,j≤n-1),则称其为n阶对称矩阵。
对称矩阵的压缩存储的策略:
存储时可只存储对称矩阵中上三角或下三角中的元素,使得对称的元素共享一个存储空间。

当在确定了这样的策略后,在原有的n阶矩阵中一共有n2个元素,在以行序为主序存储其下三角+对角线的元素时,只需要存储n(n+1)/2个元素。当在以行序为主序存储其上三角+对角线的元素时也只需要存储n(n+1)/2个元素。
2. 对称矩阵的压缩存储
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 4
//为N阶对称矩阵初始化存储空间
void Init_arr(int **p)
{
if(p == NULL)
{
return;
}
//当确定了矩阵的压缩存储方式后,就可以分配存储空间了
*p = (int *)malloc(sizeof(int) *(N*(N+1)/2));
}
//将A[i][j]的值e存储到b中
void arr_Assign(int *b , int e , int i , int j)
{
if(i >= j)
{ //存储下三角的数据元素到数组B中
b[i*(i+1)/2 + j] = e;
}
else
{
//存储上三角的数据元素到数组B中
b[j*(j+1)/2 +i] = e;
}
}
//返回存储在b[M]中的A[i][j]值
int arr_Value(int *b , int i, int j)
{
//取出数组b中的下三角数据元素
if(i >= j)
{
return b[ i * (i + 1) / 2 + j];
}
else
{
return b[j * (j + 1) / 2 + i];
}
}
//输出压缩存储在b中的对称矩阵
void Disp(int *b)
{
int i;
int j;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%4d" , arr_Value(b , i,j));
}
printf("\n");
}
}
//销毁存储空间
void Destroy(int *b)
{
free(b);
b = NULL;
}
int main(void)
{
int *arrB = NULL;
int i = 0;
int j = 0;
int value = 0;
Init_arr(&arrB);
printf("请输入对称矩阵的下三角部分:\n");
for(i = 0; i < N; i++)
{
printf("输入第%d行的%d个数据元素: ", i+1, i+1);
for(j = 0; j <= i; j++)
{
scanf("%d" , &value);
arr_Assign(arrB,value , i,j);
}
}
//打印输出
printf("输出对称矩阵;\n");
Disp(arrB);
Destroy(arrB);
return 0;
}