1.先介绍对角矩阵和对称矩阵,因为他们的压缩方式都是相同的
- 对称矩阵:各数据元素沿主对角线对称的矩阵
- 对角矩阵:上(下)三角矩阵
- 用一维数组来储对称矩阵,需满足公式:(i*(i-1))/2 + j -1 ,这里的i和j都是从1开始的
1.1 对称矩阵,对角矩阵代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
'''
对称矩阵
[1,2,3]
[2,4,5]
[3,5,6]
'''
matrix = [[1,2,3],
[2,4,5],
[3,5,6]]
'''
对角矩阵,下三角
[1,2,3]
[0,4,5]
[0,0,6]
'''
matrix1 = [[1,0,0],
[2,4,0],
[3,5,6]]
# 按照公式,存储的一维数组,下三角
def saveArray(matrix):
size = len(matrix)
array = [0]*int(size*(size-1)/2+size)
i = 1 # 行
for arr in matrix:
for number in arr:
j = arr.index(number) +1 # 列
if i>=j:
k = int(((i-1)*i)/2+(j-1))
array[k] = number
i+=1
return array
print(saveArray(matrix))
print(saveArray(matrix1))
2.稀疏矩阵
- 非零元素个数远小于矩阵元素总数 储存方式:储存非0元素的值同时储存其位置
2.1 我们使用三元组顺序表来储存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
sparseMatrix = [[1,0,0],
[0,0,5],
[3,0,0]]
def savesparseMatrixToArray(matrix):
# 稀疏矩阵
sparseMatrix = {
"arr": [],
"n": 0, # 矩阵的行
"m": 0, # 矩阵的列
"num": 0 # 矩阵非0元素的个数
}
count =0
i = 1 # 行
for arr in matrix:
for number in arr:
if number !=0:
j = arr.index(number) + 1 # 列
sparseMatrix["arr"].append((number,i,j))
count +=1
i += 1
sparseMatrix["n"] = i
sparseMatrix["m"] = j
sparseMatrix["num"] = count
return sparseMatrix
print(savesparseMatrixToArray(sparseMatrix))