对称矩阵的压缩存储

对称矩阵

主要分享对特殊矩阵中对称矩阵的压缩存储,如果其中有一些错误请多多包涵。

 

1>什么是对称矩阵

对称矩阵是一种特殊的矩阵:其数据沿着对角线对称(沿着对角线一一对称)

这里涉及到线性代数其中的一个概念,如果一个矩阵的转置矩阵对于自身则该矩阵为对称矩阵

同时对称三角形对称矩阵以对角线为分界线可分为上三角和下三角

2>压缩存储的必要性

矩阵和数组的联系:

线性代数上的矩阵等价于数据结构中的数组,例如A=[1,2,3,4,5,6]这是一个1x6的矩阵同时也是一个一维数组。同理就会有二维数组三维数组一直到n维数组分别对于矩阵

对称矩阵的必定满足行=列,要不然无法满足对称条件

存储方式

在计算机中对于一阶矩阵我们就会开辟一个一维数组去存储(相对简单便利),但是随着阶数的增加如果我们再去开辟同样维数的地址空间那么系统存储的代价就会很大。所以我们要进行压缩矩阵去存储(这里的压缩并不是丢失数据)

所以综上我们可以得到要尽可能的去减少内存的占有同时尽可能的提高内存的利用率,则对于这种特殊矩阵是可以进行处理达到以最少的内存去存储(以对角线为分界线存储一半的数据就可以存储整个矩阵的数据在根据对称可以存储每个位置的数据)

3>分析步骤

数组占用地址=数据数目*数据类型大小 (可以通过sizeof函数得到数据类型的大小)

对称矩阵有两种排列方式: 1 按照行序进行排列(一行存满在转到下一行) 2 按照列进行排列(一列存满在转到下一列)

按照行进行排列(假设有矩阵Dnxn,其中下标从1开始)//矩阵中下标多从1开始,数组中以0开始

先不考虑数据对应问题,我们假设现将xia三角数据全部放到一维数组中。所以需要考虑三个因素:数组的长度、如何定位数据(比如Aij)、如何将下三角元素表达

数组长度:

需要计数上三角中所有数据的个数,

第一行a11(1个数据)

第二行a21-->a22 (2个数据)

.....

第n行an1--->ann(n个数据)

综上课只下三角共有数据数量:1+2+3.....+n=[n(n+1)/2]-1=maxsize,这就是我们开辟一维数组数据的总长度也就是data[maxsize]

同理就可以计算任意点的位置

定位数据(比如Aij)

第一行a11(1个数据)

第二行a21-->a22 (2个数据)

.....

第i-1行a(i-1)1--->a(i-1)n(i-1个数据)

位置:1+2+3.....+i-1+j=[i(i-1)/2]+j-1

所以就完成了对数组maxsize和对任意位置的定位

下三角元素表达

这个可以根据对称原理:Aij=Aji,即可完成对下三角数据的表达和保存

同理如果是按列进行存储只需要将公式中的i换成j即可

4>代码实现

这里实现是按行存储在下三角型的情况

定义一个4阶的矩阵

int array[4][4] = {
		{1,2,3,4},
		{2,9,4,5},
		{3,4,0,6},
		{4,5,6,3},
	};
	printf("对称矩阵如下\n");
	for (int i = 1; i <=4; i++)
	{
		for (int j = 1; j <=4; j++)
		{
			printf("a[%d][%d]=%d ", i, j, array[i-1][j-1]);
			if (j == 4)
				printf("\n");
		}
	}

赋值并且输出一维数组: 

for (int k = 0; k < maxsize ; k++)
	{
		for (int i = 1; i <=4; i++)
		{
			for (int j = 1; j <=4; j++)
			{
				if (i*(i - 1) / 2 + j - 1 == k)
				{
					array1[k] = array[i - 1][j - 1];
				}
			}
		}
	}
	printf("一维数组:");
	for (int i = 0; i < maxsize; i++)
	{
		printf("%d ",array1[i]);
	}

猜你喜欢

转载自blog.csdn.net/qq_46861651/article/details/113271863