資料結構 壓縮特殊矩陣

2021-07-16 08:09:57 字數 2014 閱讀 6822

矩陣是一種常用的數學物件,一般情況下,小的矩陣我們可以直接用二維陣列直觀方便地儲存,但是在科學與工程計算問題中常會遇到較高階數的矩陣,並且矩陣中會出現大量零元素,或者矩陣中的元素呈某種規律分布。如果在這種情況下仍然採用二維陣列描述矩陣,看起來儲存密度為1,實際上卻占用了許多單元去儲存零元素或重複的非零元素,從而會造成極大的浪費。為了節省儲存空間,我們可以對這類矩陣進行儲存壓縮。

所謂的儲存壓縮是指:為矩陣中多個相同的元素只分配乙個儲存空間,對零元素不分配空間。特殊矩陣和稀疏矩陣是兩類適合進行壓縮儲存的矩陣。本文先講特殊矩陣,所謂的特殊矩陣是指非零元素分配有一定規律的矩陣,常見的特殊矩陣有對稱矩陣、三角矩陣、三對角矩陣等。

在n階方陣中,有a[i][j] == a[j][i]性質的,稱為對稱矩陣。

對稱矩陣的元素關於主對角線對稱,故只要儲存矩陣中上三角部分或者下三角部分就可以。這相當於讓每兩個對稱的元素共享儲存空間,能節約近一半的空間。

這裡儲存下三角。

在對稱矩陣的下三角部分中,第i行恰有i + 1個元素,總數為[n * (n + 1)] / 2.

因此,我們可以按照如下圖所示的順序將其存入到乙個一維陣列s中實現壓縮儲存。

一維陣列s的大小應該是[n * (n + 1)] / 2,其下標k的範圍為0 ~ [n * (n + 1)] / 2 - 1;

為了訪問對稱矩陣a中的元素,我們必須在兩者之間找到相應的對稱關係:

若i >= j,則a[i][j]在下三角部分中,a[i][j]之前的i行一共有1+2+3+…+i = [i * (i + 1)] / 2個元素,在第i行上,a[i][j]之前恰有j個元素,因此有:k = [i * (i + 1)] / 2 + j (i >= j);

若i < j,在上三角部分中,因為a[i][j] == a[j][i],所以只要交換上式的i和j即可:k = [j * (j + 1)] / 2 + i (i < j);

三角矩陣是指主對角線以上或者以下均是常數c。

下三角矩陣的儲存方式和對稱矩陣類似,不同之處在於除了儲存下三角中的元素以外,還要儲存對角線上方的常數。因為是同乙個常數,所以只存乙個即可。這樣,一共儲存了[n * (n + 1)] / 2 + 1個元素,將其存入陣列s[n * (n + 1) / 2 + 1]中,任一元素下標的對應關係為:

k = [i * (i + 1)] / 2 + j  (i >= j);

k = [n * (n + 1)] / 2 (i

< j);

儲存思想與下三角矩陣類似,只不過其第0行儲存n個元素,第1行儲存n - 1個元素…所以aij的前面有0~i-1共i行,儲存著i * (2n - i + 1) / 2個元素,而aij是它所在行的第j-i+1個元素,所以,aij是一維陣列中的第i * (2n - i + 1) / 2 + (j - i + 1)個元素,c++中的元素下標從0開始,因此元素aij在s中的下標為k = i * (2n - i + 1) / 2 + (j - i)

綜上,上三角矩陣中任一元素aij下標的對應關係是:

k = i * (2n - i + 1) / 2 + (j - i)  (i

<= j);

k = [n * (n + 1)] / 2 (i > j);

三對角矩陣是指除了對角線以及離對角線最近的上下兩邊兩斜行意外的其他元素均為0的矩陣。

同樣,為了節省空間,我們只儲存對角線及其上下兩側對角線上的元素,主次對角線以外的零元素均不儲存。

矩陣第0行和第n-1行只有兩個非零元素,其餘各行有3個非零元素,總共有3n-2個非零元素.

所以,不在第0行的非零元素aij,他前面有3(i - 1) + 2個非零元素,而在本行中的j列前面有j-i+1個元素,所以元素aij在s中的位置k = 2i + j

圖:三對角矩陣的壓縮儲存

資料結構 特殊矩陣

在乙個n階方陣a中,若元素滿足下述性質 則稱a為對稱矩陣。1 只要儲存矩陣中上三角或下三角中的元素,讓每兩個對稱的元素共享乙個儲存空間,這樣,能節約近一半的儲存空間 2 元素的個數為 n n 上三角矩陣 矩陣下三角部分 不包括對角線 元素全為c c可以為0 的矩陣 下三角矩陣 矩陣上三角部分 不包括...

資料結構 特殊矩陣的儲存壓縮及解壓

特殊矩陣的儲存壓縮及解壓 define crt secure no warnings define empty queue error 999999 include include include include include define maxlen 100 typedef int elemt...

資料結構 壓縮矩陣筆記

陣列的壓縮儲存 在一些高階矩陣中,非零元素非常少,此時如果使用二維陣列將造成 儲存空間的浪費,這時可只儲存部分元素,從而提高儲存空間的利用 率,通常的做法是為多個相同值的元素只分配乙個儲存單元,對值為 零的元素不分配儲存單元。我們把非零元素個數遠小於二維陣列總元 素個數,或元素分布呈一定規律的 對稱...