对角矩阵压缩储存为一维数组


本篇博客主要是关于对角矩阵压缩存储为一维数组,我们以三对角矩阵为例(ps:通篇对角矩阵存储在二维数组,一维数组的初始下标都是从0开始的)

三对角矩阵:它“几乎”是一个对角矩阵。一个三对角矩阵的非零系数分布在主对角线以及两边的线上,呈带状分布,其余的位置元素的值都是0。例如下图:

如果将此三对角矩阵通过二维数组的方式进行存储,有许多0元素,这必然会浪费较多空间,所以我们来探讨是否可以通过一维数组的方式来压缩存储,从而尽可能利用更多空间 

通过观察图1,我们可以看出三对角矩阵除去首行和尾行分别有2个非0元素,其余行都是3个非0元素。

 

 

 如果没有看出来可以看看下面这个

      

 

依旧可以得出结论:三对角矩阵除去首行和尾行分别有2个非0元素,其余行都是3个非0元素。

所以通过这个我们可以进一步进行分析

首先非0元素的个数:有(n-2)行3个非0元素 ,首尾两个元素,所以个数有   3*(n-2)+2*2=3*n-2

其次压缩存储为一维数组的关键是一维数组的下标k值

在  行  列的k值:

可以先考虑前 行(不包括 行)有多少非0元素,据图可得有(i-1)*3+2 个元素,其中2是第一行非0元素的个数,3是指每行非0元素个数

然后再考虑第 i 行被选中的元素的位置,根据主对角线可以先确定中间元素在该行的位置,要么是(i-j)+1,要么就是(j-i)+1。这里可以利用该行其余两个非0元素的位置得出第i行被选中的元素的位置(j-i)+1

所以k =(i-1)*3+2+(j-i)+1=2*i+j

所以利用k可以推导出二维数组i,j的值,i=(k+1)/3当k=2时,i=1;当k=5时,i=2;当k=8时,i=3;则可以推导k=3*i-1)

  j=k-2*i(通过k=2*i+j推导);

所以根据中间非0元素有3 个就可以轻松得出k的值,然后可以进一步推导。

其余的对角矩阵也可以通过此类方式推理出来

下面附部分代码和运行结果

 

 

 

 

 

 

  以上就是我对 对角矩阵压缩储存一维数组的理解与思考,谢谢观看!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM