对称矩阵的压缩存储

发布于:2022-11-28 ⋅ 阅读:(916) ⋅ 点赞:(0)

目录

对称矩阵

问题描述 

代码实现

运行结果 


对称矩阵

若 n 阶矩阵A中的元素满足下述性质:  aij=aji   则称为 n 阶对称矩阵。 

对于对称矩阵,可以为每一对元素分配一个存储空间,则可将 n^2个元素压缩存储到 n(n+1)/2个元素的空间中。例如,只存储下三角中的元素aij,其特点是j<=i且0<=i<=n-1,对于上三角中的元素aij,它和对应的aji相等,因此当访问的元素在上三角时,直接去访问和它对应的下三角元素即可,这样,原来需要 n^2个存储单元,现在只需要n(n+1)/2个存储单元了,节约了n(n-1)/2个存储单元。 

假设以一维数组 sa[n(n+1)/2]作为 n 阶对称矩阵A的压缩存储结构,以行序为主序存储其下三角,则 sa[ k ]和矩阵元素aij之间存在着一一对应的关系:

当i>=j时,k=i(i+1)/2+j

当i<j时,k=j(j+1) /2+i

对于矩阵中任意给定一组下标(i,j),均可在 sa[ ]中找到对应的矩阵元素aij;反之,对所有的k=0,1,2……n(n+1)/2-1都能确定 sa[ k ]中的元素在矩阵中的位置(i,j)或(j,i)。由此,称 sa[n(n+1)/2]为 n 阶对称矩阵A的压缩存储结构。

问题描述 

【问题描述】

实现对称矩阵的压缩存储。

【输入形式】

输入一个5阶对称矩阵。矩阵元素均为整型。

【输出形式】

输出进行压缩存储后的一维数组,元素值之间以空格区分。

【样例输入】

3     6     4     7     8

6     2     8     4     2

4     8     1     6     9

7     4     6     0     5

8     2     9     5     7

【样例输出】

3 6 2 4 8 1 7 4 6 0 8 2 9 5 7 

 

代码实现

#include<stdio.h>
#define MAXSIZE 12500
typedef int ElemType;
typedef struct
{
	int i,j;
	ElemType e;
}Triple;
typedef struct
{
	Triple data[MAXSIZE+1];
	int mu,nu;
}TSMatrix;
void Init(TSMatrix *t) 
{
	t->mu = 5;
	t->nu = 5;
}	
void Create(TSMatrix *t)
{
	int x, a = 0 , b = 0 , q = 0;
	while(a < 5)
	{
		scanf("%d",&x);
		t->data[q].i = a;
		t->data[q].j = b;
		t->data[q].e = x;
		b ++ ;
		q ++ ;
		if(b >= 5)
		{
			printf("\n");
			a ++;
			b = 0;		
		}
	}
}
void Print(TSMatrix *t)
{
	int q;
	for(q=0 ; q < t->mu * t->nu ; q++)
	{
		if(t->data[q].j <= t->data[q].i)
			printf("%d ",t->data[q].e);
	}
}
int main()
{
	TSMatrix M;
	Init(&M);
	Create(&M);	
	Print(&M);
	return 0;
}

运行结果 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到