对角矩阵的压缩存储

这篇具有很好参考价值的文章主要介绍了对角矩阵的压缩存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对角矩阵

●定义

• 若一个n阶方阵A满足,其所有非零元素都集中在以对角线为中心的带状区域中,则称其为n阶对角矩阵

对角矩阵压缩存储,笔记,算法

●术语

        • b - 矩阵半带宽:主对角线上下方各有b条次对角线
        • (2b+1)--矩阵的带宽

● 特征

        • 对于半带宽为 b(0<=b<(n-1))的对角矩阵,其|i-j|<=b的元素 ai,j不为零,其余元素为零.

●存储策略:

        •为了压缩存储空间,为0的空间,我们就不存储,或者判断出不是带状区域就输出 0
        •找到对角矩阵坐标和一维数组的关系,进而对坐标进行换算,映射一维数组位序
        •设计算法,保证逻辑结构不变,存储空间减小
        • 利用一维数组,按顺序存储对角矩阵的元素

对角矩阵压缩存储,笔记,算法

●观察对角矩阵的结构(我们此处以三对角矩阵举例):

        •在三对角矩阵中,除了第一行和最后一行各有两个元素,其余各行非零元素aij均有三个,所以共有(3n-2)个非零元素 ,(第一行和最后一行,节点个数为2两个)
        • 处于对角线下方的节点,(a10,a21,a32,...),观察得出,有:j = i-1;
        • 处于对角线上的节点,(a00,a11,a22,...),有 : j=i;
        • 处于对角线上方的节点,(a01,a12,a23,...),有: j=i+1;

●寻找二维坐标和一位数组的位序关系

•方法一: 输入坐标的时候,可以判断,然后确定是哪个位置上的节点,从而得出对应的一维数组的位序
        •方法二:① 观察
                ② 先确定节点,前i行的元素个数,为: 2+3*(i-1)=3i-1;
                 因为,第一行和最后一行有两个元素,所以先把第一行算上,然后再算剩余i-1行,即可.
                ③ 对角线下方的节点, aij是本行第一个非零元素,所以其前面的元素是k = 3i-1 = 2i+j
                ④ 对角线的节点,是本行的第二个非零元素, k = 3i = 2i+j
                ⑤ 对角线上方的节点,是本行的第三个非零元素, k = 3i+1 = 2i+j;
        •我们一维数组是从0开始计算的,所以元素前面的节点个数,就是对应的坐标位序


对角矩阵压缩存储,笔记,算法

●下面我们开始构建三对角矩阵代码:

#include <stdio.h>
#include <malloc.h>
#define N 6
//构建一维数组数组
void Init(int *&b)
{
	b = (int*)malloc(sizeof(int)*(3*N-1));
}
//将e赋值给对应的二维数组A[i][j]里面的值,存储在一维数组里面
void Assign(int b[],int e,int i, int j)
{
	if(j == i-1)
	{
		b[3*i-1] = e;
	}
	else if(j == i)
	{
		b[3*i] = e;
	}
	else if(j==i+1)
	{
		b[3*i+1] = e;
	}
}
//返回特定坐标里面的数值
int Value(int b[],int i, int j)
{
	if(j == i-1)
	{
		return b[3*i-1];
	}
	else if(j == i)
	{
		return b[3*i];
	}
	else if(j==i+1)
	{
		return b[3*i+1];
	}
	else
	{
		return b[3*N-2];
	}
}
//逐个输出二维数组里面的数据
void Disp(int b[])
{
	int i,j;
	for(i=0; i<N; i++)
	{
		for(j = 0; j<N; j++)
		{
			printf("%4d",Value(b,i,j));
		}
		printf("\n");
	}
}
//销毁存储空间
void Destroy(int b[])
{
    free(b);
}


int main()
{
	//构建一维数组
	//一维数组在元素矩阵个数的基础上加一,存放两侧的数据
	int *b1;
	//坐标
	int i,j;
	//承载输入数据
	int v;
	//构建一位数组
	Init(b1);
	printf("请输入要压缩的带状数据两侧的数据是多少?\n");
	scanf("%d",&v);
	b1[3*N-2] = v;
	printf("请一次输入矩阵内的数据");
	for(i=0;i<N;i++)
	{
		printf("请输入第%d行的%d个元素\n",i+1,N);
		for(j = 0;j < N;j++)
		{
			scanf("%d",&v);
			Assign(b1,v,i,j);
		}
	}
	Disp(b1);
    Destroy(b1);
    return 0;
}

运行结果如图:

对角矩阵压缩存储,笔记,算法

 文章来源地址https://www.toymoban.com/news/detail-736214.html

 

到了这里,关于对角矩阵的压缩存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】数组和字符串(二):特殊矩阵的压缩存储:对角矩阵——一维数组

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月08日
    浏览(37)
  • 【数据结构】三对角矩阵(带状矩阵)的压缩 数组下标转换

    王道书中给出定义如下: 书中没有给出具体的推导过程,在CSDN上也没搜到,因此我来发一篇(哈哈哈哈哈 推导过程如下: 首先除去第一行。 从第二行开始,当矩阵的下标为(i,j)的时候: 前面一定会有第一行的2个 会有从第2行开始到第i-1行的每行3个,因此是3(i-1-2+1)=3(i-2)

    2024年02月07日
    浏览(38)
  • 数据结构笔记NO.1(绪论、线性表、栈队列和矩阵的压缩存储)

    1、数据结构 三要素 :逻辑结构、存储结构(物理结构)、数据的运算。 (1)逻辑结构:是指数据元素之间的逻辑关系,即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。 (2)存储结构(物理结构):是指数据在计算机中的表示(又称映像),是用计算机语

    2024年02月04日
    浏览(31)
  • 宋浩线性代数笔记(五)矩阵的对角化

    本章的知识点难度和重要程度都是线代中当之无愧的T0级,对于各种杂碎的知识点,多做题+复盘才能良好的掌握,良好掌握的关键点在于:所谓的性质A与性质B,是谁推导得谁~ 目录 5.1矩阵的特征值和特征向量 5.2特征值和特征向量的性质 5.3相似矩阵and矩阵可对角化的条件 

    2024年02月13日
    浏览(44)
  • 矩阵的压缩存储

    本文主要内容:本文主要介绍几种 特殊矩阵的压缩存储 。 特殊矩阵 指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素的分布有一定规律性的矩阵,常见的特殊矩阵有 对称矩阵、上(下)三角矩阵、对角矩阵 等。 压缩存储 指为多个值相同的元素只分配一个存储空

    2024年02月07日
    浏览(22)
  • 上三角矩阵的压缩存储

          我们称有许多值相同的元素或许多零元素,并且值相同的元素或零元素的分布有一定规律的矩阵为 特殊矩阵。 当矩阵的阶数比较大时,矩阵占据的内存空间相当多,这时,利用特殊矩阵元素的分布规律压缩矩阵的内存空间,对许多应用问题来说有重要的意义。特殊矩

    2024年02月06日
    浏览(23)
  • 对称矩阵的三对角分解(Lanzos分解算法)-MINRES算法预热

    这篇博客看完以后接着看下一篇博客添加链接描述专门介绍MINRES算法实现就容易了 首先介绍Lanczos分解,Lanzos把对称矩阵转换为一个三对角对称矩阵。考虑三对角对称矩阵如下,考虑正交分解 T = Q T A Q T = Q^T A Q T = Q T A Q T = ( α 1 β 1 0 ⋯ 0 0 β 1 α 2 β 2 0 ⋯ 0 0 β 2 α 3 β 3 ⋯ 0

    2024年02月03日
    浏览(196)
  • 【数据结构】矩阵的压缩存储

    5.1 普通矩阵的存储 用二维数组存储 分为行优先和列优先: 行优先:优先存放一行的数据。 列优先:优先存放一列的数据。 注意下标是从0还是1开始的! 5.2 对称矩阵的存储 对称矩阵定义 若n阶方阵中任意一个元素 a i , j a_{i,j} a i , j ​ 都有 a i , j = a j , i a_{i,j}=a_{j,i} a i , j

    2024年03月18日
    浏览(45)
  • 【数据结构】特殊矩阵的压缩存储

    🌈 自在飞花轻似梦,无边丝雨细如愁 🌈   🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录 🌟 数组是由n个相同类型的数据元素所构成的有限序列 数组和线性表的关系: 数组是线性表的推广:一维数组可以看做是一个线性表,而对于二维数组而言,可以看成是有

    2024年02月11日
    浏览(32)
  • 数据结构--特殊矩阵的压缩存储

    各数组元素大小相同,且物理上连续存放。 数组元素a[i]的存放地址= LOC + i * sizeof(ElemType) ( 0 ≤ i 10 ) (0le i 10) ( 0 ≤ i 10 ) 注:除非题目特别说明,否则数组 下标默认从 0 开始 color{red}下标默认从0开始 下标默认从 0 开始 注意审题 ! 易错 ! color{purple}注意审题!易错! 注意审题

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包