对角矩阵的存储

对角矩阵

导向

  1. 了解相关的概念和关键词术语

  2. 存储空间的计算

  3. 前提条件的分析

  4. 对任意数据的定位

  5. 代码实现

 

1>概念和关键词

概念:对角矩阵又称是带状矩阵,是指在(nxn)的矩阵非零元素集中在主对角线及其两侧,共L(奇数)条对角线的带状区域内,则称为L对角矩阵。

平行于主对角线的非零元素连成的线称作带宽:上三角下三角各有半带宽

同时该矩阵的行和列是相同的,所以该矩阵以对角线上下对称(而且对角线上数据行=列)

 

2>存储空间的计算

对矩阵数据的统计=需要存储的空间(data[masize]),对角矩阵每行数据没有规律也不便于统计。如果随着阶数的增长统计难度会逐渐加大,即需要一个方便简洁的统计方法,如果矩阵每一行的数据的数量是一致相同的的那么就会大大减小了统计的难度。

可以对每行进行数据填充但又不影响存储(可以对每行进行填充零元素,这样既保证了每行数据相同又不影响数据存储):

这样每一行的数据数量都相同,矩阵外的数据不用存储。

maxsize(一维数组的数量):每行数据x行数(LxN-2d),第一行和最后一行的零不进行存储所以要减去(d为半带宽)

 

3>前提条件的分析

目的:将矩阵带状中的数据存储到一维数组中

排序:存储顺序和矩阵顺序保存一致

由此可知数据必须在矩阵带状中才可以进入一维数组,则应将带状以外的数据全部排除掉

以对角线为界分析可知,下标之差最大为半带宽。而带状之外的数据下标之差已经超过了半带宽,由此可以利用对角线进行判断区分数据

Aij  若|i-j|>d则说明数据全部在带状以外均为零,不用存储

     若|i-j|<=d则说明数据在带状以内是需要存储的数据,可以对其进行查询和输出

 

4>任意数据的定位

对数据定位的前提条件,定位在带状区域内才可以进行定位。若不在则无法定位,所以查询数据时的判断条件为数据是否在带状区域内

现在假设查询数据为Aij,数据最终会放进一维数组中。则统计Aij前面共有多少个数据就可以得知Aij在一维数组中的具体位置。

Aij前有i-1行每行的数据数量为L,则可知道前i-1行的数据数量是(i-1)xL-d

第i行中对角线前的数据有d个(半带宽的数量)

最后加上j-i即可,综上可知在第一行减去了一个d个零(掐头去尾),在第i行中加上了一个d的数据最后抵消

数量=(i-1)xL+j-i//任意数据的位置

5>代码实现

void main()
{

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

区觉得函数,头文件math和stdlib都可以 

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

猜你喜欢

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