数据结构-矩阵压缩

矩阵的压缩

Posted by Hzy on November 20, 2019

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))