對角矩陣壓縮儲存為一維數組


本篇博客主要是關於對角矩陣壓縮存儲為一維數組,我們以三對角矩陣為例(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