概述:主要是推導出上/下三角矩陣、對稱矩陣存儲在一維數組中的方法
a.下三角矩陣
一個n×n階矩陣,i爲行下標,j爲列下標,i>=j的部分構成的三角矩陣,稱爲下三角矩陣,形式如下:
a[0,0]
a[1,0] a[1,1]
a[2,0] a[2,1] a[2,2]
存儲一個矩陣最直觀的就是用二維數組存儲,如果用一維數組存儲的話,就會有一個下標轉換的問題,下三角矩陣轉化爲一維數組時,一維數組下標和矩陣元素的對應關係如下:
array[0]
array[1] array[2]
array[3] array[4] array[5]
很容易可以發現,在每一行中,第一個以後的下標都是第一個下標加上對應矩陣的列下標,如第三行第一個下標爲3,第三行第三列對應的矩陣列下標爲2,所以第三行第三列的下標爲3+2=5;每一行第一個下標取值則取決於前面所有行的元素個數總和,可以發現,每一行包含的元素個數是一個等差數列,所以下標爲i的行(第i+1行),前面的元素共有 ((1+i)*i)/2 個,也就是下標爲i的行,其第一個下標爲 ((1+i)*i)/2,所以得到下三角矩陣用一維數組存儲時,矩陣下標i、j和一維數組下標k的對應關係如下:
k = ((1+i)*i)/2+j (i>=j)
這個公式的含義是:在下三角矩陣中,a[i,j]位置對應的值存儲在array[k]中
b.上三角矩陣
一個n×n階矩陣,i爲行下標,j爲列下標,i=<j的部分構成的三角矩陣,稱爲下三角矩陣,形式如下:
a[0,0] a[0,1] a[0,2]
a[1,1] a[1,2]
a[2,2]
上三角矩陣轉化爲一維數組時,一維數組下標和矩陣元素的對應關係如下:
array[0] array[1] array[2]
array[3] array[4]
array[5]
類似下三角矩陣,上三角矩陣中,下標爲i的行,第一個以後的下標都是第一個下標加上對應矩陣的(列下標-行下標),如第二行第一個下標爲3,第二行第三列對應的矩陣列下標爲2,行下標爲1,所以第二行第三列的下標爲3+(2-1)=4;每一行第一個下標取值則取決於前面所有行的元素個數總和,同樣是一個等差數列,所以下標爲i的行(第i+1行),前面的元素共有 ((n+n-(i-1))*i)/2 = ((2n-i+1)*i)/2 個,也就是下標爲i的行,其第一個下標爲 ((2n-i+1)*i)/2,所以得到上三角矩陣用一維數組存儲時,矩陣下標i、j和一維數組下標k的對應關係如下:
k = ((2n-i+1)*i)/2+j-i (i<=j)
含義同上:在上三角矩陣中,a[i,j]位置對應的值存儲在array[k]中
c.對稱矩陣
對稱矩陣是指矩陣元素滿足 a[i,j]=a[j,i] 的矩陣。
在進行壓縮存儲時,可以只存儲主對角線和上/下部分元素,一個n階矩陣,只需要 n(n+1)/2 個存儲單元。爲了方便,我們採用存儲主對角線和下半部分的方式(即存儲下三角矩陣),其中下半部分,一維數組下標和矩陣下標的對應關係和下三角矩陣一樣;上半部分,由於 a[i,j]=a[j,i] 所以只需要把i和j互換即可,得到的矩陣下標i、j和一維數組下標k的對應關係如下:
k = ((1+i)*i)/2+j (i>=j)
k = ((1+j)*j)/2+i (i<j)
含義同上:在對稱矩陣中,a[i,j]位置對應的值存儲在array[k]中
d.對角矩陣
如果一個矩陣的所有非零元素都集中在以主對角線爲中心的帶狀區域,該矩陣就稱爲對角矩陣。
這裏主要討論主對角矩陣和三對角矩陣。一個矩陣除了主對角線上的元素外,其餘元素全部爲0,則爲主對角矩陣;除了主對角線及主對角線上下各一個元素外,其餘元素全部爲0,則爲三對角矩陣。
對於主對角矩陣,矩陣下標i、j和一維數組下標k的對應關係很簡單:
k=i 或 k=j
對於三對角矩陣,除了第一行和最後一行是兩個元素,其它行都是三個元素,所以下標爲i(i>0)的行,前面行的元素共有 3*i-1 個,該行第一個元素前面有 i-1 個元素不屬於這三條對角線,所以對於三對角矩陣,矩陣下標i、j和一維數組下標k的對應關係如下:
k = (3*i-1)+(j-(i-1)) = 2*i+j
對於任意m對角矩陣,其矩陣下標i、j和一維數組小標k的對應關係比較複雜,這裏不再討論。有興趣的可以閱讀下面的論文:
m條對角線的n階對角矩陣壓縮存儲的通用尋址公式