特殊矩阵的存储

今天给大家分享的是对称矩阵的压缩存储,大家都知道,对称矩阵是除了主对角线外,其他的元素一一对应相等,下面大家看看这个代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define ROW 4
#define COL 4
//对称矩阵的压缩存储(行优先存储)
void compress(int arr[ROW][COL], int row, int col)
{
	int press[ROW * COL - 6] = { 0 };
	int i = 0;
	int j = 0;
	int k = 0;
	//应该从1开始,因为如果从0开始,后面在计算k的时候会覆盖值
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= i; j++)
		{
			if (k < ROW * COL - 6)
			{
				//k减1的原因是,计算的是此时的这个i,j是第几个元素,然后再数组中表示的就是下标,所以减1
				k = (i * (i - 1)) / 2 + j - 1;
				//因为是从1开始的,所以要减1对应他的二维数组的下标
				press[k] = arr[i - 1][j - 1];
			}
		}
	}
	scanf("%d%d", &i, &j);
	if (i >= j)
	{
		k = (i * (i - 1)) / 2 + j - 1;
		printf("%d", press[k]);
	}
	else
	{
		int swap = i;
		i = j;
		j = swap;
		k = (i * (i - 1)) / 2 + j - 1;
		printf("%d", press[k]);
	}
}
int main()
{
	int arr[ROW][COL] = {
		{1,2,3,4},
		{2,5,6,7},
		{3,6,9,8},
		{4,7,8,1},
	};
	compress(arr, ROW, COL);
	return 0;
}

总体思路大概就是选择下三角区域或是上三角区域来存储进一维数组,然后算出此时i,j分别对应的是第几个元素,让算出来的第几个元素减1当做一维数组的下标,一一对应存储就好。sauna他是第几个元素的方法是,假设就拿主对角线下面的来存储,因为第1行有1个元素,第二行2个,所以以此就是  1,2,3,4.....i,总共的元素就是等差数列前n想求和了,求和是应注意的是,如果你想算第i行前面有几个元素,那么先算i-1行的元素,在加j就是此时的这个元素的位置,应为要对应到一维数组中,所以在-1.用图像来解释,如下:

注:i一定要从1开始 ,不然会覆盖数据

最后,如果你学到了这个方法的话,请点一下赞吧!!!!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值