本篇博客主要是關於對角矩陣壓縮存儲為一維數組,我們以三對角矩陣為例(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值
在 i 行 j 列的k值:
可以先考慮前 i 行(不包括 i 行)有多少非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的值,然后可以進一步推導。
其余的對角矩陣也可以通過此類方式推理出來
下面附部分代碼和運行結果
以上就是我對 對角矩陣壓縮儲存一維數組的理解與思考,謝謝觀看!