特殊矩陣的儲存壓縮及解壓
#define _crt_secure_no_warnings
#define empty_queue_error -999999
#include
#include
#include
#include
#include
#define maxlen 100
typedef
int elemtype;
//形如對稱矩陣、三角矩陣等特殊形式的矩陣,只需儲存其中的部分元素即可,稱為「壓縮儲存」。關鍵是建立矩陣中元素的 行列 索引與 一維陣列 儲存空間 索引之間的關聯關係。
//(17)對稱矩陣
//(18)矩陣結構體的定義
//定義乙個壓縮矩陣的結構體型別,用一維陣列來儲存矩陣中的元素。為了簡單起見,令矩陣為dim* dim的方陣。其中,dim為一確定的整數大小。
#define maxlen 100
#define dim 4
typedef
struct
intcompressedmatrix;
/*壓縮矩陣就是由乙個矩陣壓縮成一維陣列,而非一般意義的矩陣*/
/*matrix /'meɪtrɪks/n.矩陣*/
/*(19)對稱矩陣的初始化與讀取
用乙個對稱矩陣(定義為m[dim][dim]) 來初始化(填充) 該壓縮矩陣
壓縮:*/
void
initsmatrix
(intcompressedmatrix* pmat,
int m[dim]
[dim]
)//該函式正確.
// 讀取(對稱矩陣的壓縮矩陣中解壓出來(一次乙個元素),將值儲存到x中.)
intget
(intcompressedmatrix* pmat,
int i,
int j,
int* x)
/* 給x賦值
由於只儲存了i>=j的下三角,如果欲讀取j>i的上三角元素,怎麼讀取?*/
if(i >= j)
*x = pmat->elem[
(i-1)*
((i-1)
+1)/
2+ j -1]
;else
*x = pmat->elem[
(j -1)
*((j -1)
+1)/
2+ i -1]
;return1;
}//函式已修正.
/*(20)三角矩陣的訪問(重複元素集中在某一側)("三角"分為上三角和下三角)
對三角矩陣進行壓縮儲存,寫出與上述對稱矩陣類似的 結構體和操作函式。*/
intinitsmatrix_********_down
(intcompressedmatrix* pmat,
int(
*m)[dim]
)printf
("\n");
} pmat->elem[0]
= m[0]
[dim -1]
;}/*傳入原始矩陣的任意位置(i,j)*/
intget_********_down
(intcompressedmatrix* pmat,
int i,
int j,
int*x)
int subscript_row = i -1,
subscript_col = j -1;
if(i >= j)
else
return1;
/*讀取成功*/
}/*分析上三角:(記憶體迴圈收縮左邊界)*/
/*將上三角矩陣壓縮到pmat矩陣(或者說一維陣列)中*/
intinitsmatrix_********_up
(intcompressedmatrix* pmat,
int m2_2[
][dim]
)printf
("\n");
} pmat->elem[0]
= m2_2[dim-1]
[0];
}/*解壓公式:f(i,j) = (i-1)*row+j -(i-1)*((i-1) + 1) / 2;*/
/*引數變數x是原矩陣中的元素,對映f(i,j)求得的是原矩陣中(i,j)位置的元素在壓縮矩陣中的下標值.*/
intget_********_up
(intcompressedmatrix* pmat,
int i,
int j,
int* x)
if(i<=j)
else
return1;
}/*(21)對角矩陣的訪問(重複元素分布在對角線兩側)(一般說明是n對角矩陣)
對 對角矩陣進行壓縮儲存,寫出與上述對稱矩陣類似的結構體和操作函式。*/
//對角矩陣的重複元素儲存在陣列的第[0]位置上.
/*對角矩陣的壓縮沒有涉及公式*/
intinitsmatrix_tri_diagonal
(intcompressedmatrix* pmat,
int(
*m3)
[dim]
)/*diagonal /daɪ'æɡənl/ adj.對角線的, 斜的,*/
pmat->elem[index++
]= m3[i -1]
[j -1]
;/*i,j的取值控制由兩重迴圈實現控制,到訪問陣列元素前,位置參量i,j都是從1開始,在訪問時均減去1再訪問.*/
printf
("%d "
, pmat->elem[index -1]
);}//for
printf
("\n");
}//for
pmat->elem[0]
= m3[0]
[dim -1]
;}/*解壓對三角矩陣,從elem陣列中解壓出來.(訪問指定的原矩陣中的第i行,第j列位置上的元素.)
涉及兩個基礎公式,合併成第三個公式.:
前i-1行的元素個數:3(i-1)-1 (其中因子3是n對角矩陣n=3時的特例)
a(i,j)是第i行對角線區域的第 (j-i)+2 個元素(2是n對角矩陣n=3下的線性關係的修正因子)*/
intget_tri_diagonal
(intcompressedmatrix* pmat,
int i,
int j,
int* x)
if(j >= i -
1&& j <= i +1)
/*只訪問對角線和他相鄰的兩條平行線上的元素,其餘元素由else統一處理.*/
else
return1;
}/*(22)除錯
根據上述壓縮矩陣定義,完成下面**,執行並除錯程式。
*//*填充二維陣列函式fill_two_dimenssion_array(int (*arr_2)[dim])*/
void
fill_two_dimenssion_array
(int
(*arr_2)
[dim])}
}/*(22)除錯
根據上述壓縮矩陣定義,完成下面**,執行並除錯程式。
*//*填充二維陣列函式fill_two_dimenssion_array(int (*arr_2)[dim])*/
void
fill_two_dimenssion_array
(int
(*arr_2)
[dim])}
}int
main()
,,, }*/
;//初始化而非賦值,如果不直接初始化的話,第乙個乃至每個維數都不可省略;
int m2[dim]
[dim]
/*= ,,,
}*/;int m2_2[dim]
[dim]
/*= ,,,
}*/;int m3[dim]
[dim]
/*= ,,,
}*/;// 定義乙個 壓縮矩陣mat,並用m1初始化mat
intcompressedmatrix mat;
/*壓縮處理後的陣列儲存於此*/
printf
("執行壓縮處理:\n");
/* */
fill_two_dimenssion_array
(m1)
;printf
("壓縮對稱矩陣:\n");
initsmatrix
(&mat, m1)
;/* fill_two_dimenssion_array(m2);
printf("壓縮三角矩陣:\n");
initsmatrix_********_down(&mat, m2);*/
/*fill_two_dimenssion_array(m2_2);
printf("壓縮上三角矩陣:\n");
initsmatrix_********_up(&mat, m2_2);*/
/* fill_two_dimenssion_array(m3);
printf("壓縮對三角矩陣:\n");
initsmatrix_tri_diagonal(&mat, m3);*/
// 列印該mat
printf
("解壓並列印mat矩陣\n");
/*解壓並列印:(全遍例)*/
for(
int i =
1; i <= dim; i++
)printf
("\n");
}}
資料結構 壓縮特殊矩陣
矩陣是一種常用的數學物件,一般情況下,小的矩陣我們可以直接用二維陣列直觀方便地儲存,但是在科學與工程計算問題中常會遇到較高階數的矩陣,並且矩陣中會出現大量零元素,或者矩陣中的元素呈某種規律分布。如果在這種情況下仍然採用二維陣列描述矩陣,看起來儲存密度為1,實際上卻占用了許多單元去儲存零元素或重複的非...
資料結構知識點歸納(特殊矩陣的壓縮儲存)
陣列是由n n 1 個相同型別的資料元素構成的有限序列,每個資料元素稱為乙個陣列元素,每個元素受n個線性關係的約束,每個元素在n個線性關係的序號稱為該元素的下標,並稱該陣列為n維陣列 from 王道 陣列與線性表的關係 from 王道 陣列是線性表的推廣。一維陣列也可以看作乙個線性表 二維陣列也可以...
資料結構 稀疏矩陣的壓縮儲存
目錄 關於矩陣 稀疏矩陣 行優先和列優先 稀疏矩陣的壓縮儲存 在矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣 與之相反,若非0元素數目佔大多數時,則稱該矩陣為稠密矩陣。如這個稀疏矩陣,這個矩陣占用了6 7的元素型別大小,但是裡邊有大量的0,即有...