本文共 8132 字,大约阅读时间需要 27 分钟。
目录
要想了解稀疏矩阵如何解压,就要首先知道如何。
对一个压缩后的稀疏矩阵进行解压缩,还原稀疏矩阵压缩前的状态。
输入描述:
# 稀疏矩阵的有效元素数Total number of input elements: 8# 稀疏元素Input param sparse_element: 0# 原矩阵行数Matrix rows: 6# 原矩阵列数Matrix columns: 6# 稀疏矩阵第1行开始一次录入所有元素sparse_matrix[1][0]: 0sparse_matrix[1][1]: 0sparse_matrix[1][2]: 25sparse_matrix[2][0]: 0sparse_matrix[2][1]: 3sparse_matrix[2][2]: 32sparse_matrix[3][0]: 0sparse_matrix[3][1]: 5sparse_matrix[3][2]: -25sparse_matrix[4][0]: 1sparse_matrix[4][1]: 1sparse_matrix[4][2]: 33sparse_matrix[5][0]: 1sparse_matrix[5][1]: 2sparse_matrix[5][2]: 77sparse_matrix[6][0]: 2sparse_matrix[6][1]: 3sparse_matrix[6][2]: 55sparse_matrix[7][0]: 4sparse_matrix[7][1]: 0sparse_matrix[7][2]: 101sparse_matrix[8][0]: 5sparse_matrix[8][1]: 2sparse_matrix[8][2]: 38
输出描述
输出压缩矩阵和解压后的原矩阵:
------sparse_matrix------| 6 6 8 || 0 0 25 || 1 3 32 || 0 5 -25 || 1 1 33 || 1 2 77 || 2 3 55 || 4 0 101 || 5 2 38 |---------------Decompression matrix: sparse_matrix ---> matrix------matrix------| 25 0 0 0 0 -25 || 0 33 77 32 0 0 || 0 0 0 55 0 0 || 0 0 0 0 0 0 || 101 0 0 0 0 0 || 0 0 38 0 0 0 |
根据压缩矩阵的压缩方式,从压缩矩阵中读取原矩阵的配置方式,包括行数、列数和非稀疏元素数量,并根据配置初始化原矩阵。
在读取各个非稀疏元素的位置及值。根据位置将元素依次填充到原矩阵中完成解压。
class MatrixException(Exception): def __init__(self, message, code): self.message = message self.code = codedef print_matrix(matrix): """ Print matrix. :param matrix: matrix :return: None """ for row in range(len(matrix)): message = "|\t" for column in range(len(matrix[row])): message += str(matrix[row][column]) + "\t" message += "|" print(message) return# 1. 读入稀疏矩阵,并做校验try: elements_amount = int(input("Total number of input elements: ")) if elements_amount < 0: raise MatrixException("Total number of input elements must more than zero." , 1002) sparse_element = int(input("Input param sparse_element: ")) sparse_matrix = [[sparse_element] * 3 for row in range(elements_amount + 1)] sparse_matrix[0][0] = int(input("Matrix rows: ")) if sparse_matrix[0][0] <= 0: raise MatrixException("Matrix rows must more than zero.", 1003) sparse_matrix[0][1] = int(input("Matrix columns: ")) if sparse_matrix[0][1] <= 0: raise MatrixException("Matrix columns must more than zero.", 1004) sparse_matrix[0][2] = elements_amount for row in range(1, elements_amount + 1): for column in range(3): sparse_matrix[row][column] = int(input("sparse_matrix[%d][%d]: " % (row, column))) if column == 0: if sparse_matrix[row][column] >= sparse_matrix[0][0] or \ sparse_matrix[row][column] < 0: raise MatrixException("Rows list index out of range.", 1005) elif column == 1: if sparse_matrix[row][column] >= sparse_matrix[0][1] or \ sparse_matrix[row][column] < 0: raise MatrixException("Columns list index out of range.", 1006) else: if sparse_matrix[row][column] == sparse_element: raise MatrixException("Invalid elements input.", 1007)except ValueError as e: print("errcode: %s" % str(1001)) print("errmsg: %s" % str(e)) exit(1001)except MatrixException as e: print("errcode: %s" % e.code) print("errmsg: %s" % e.message) exit(e.code)# 2. 解压缩矩阵rows = sparse_matrix[0][0]columns = sparse_matrix[0][1]matrix = [[sparse_element] * columns for row in range(rows)]for row in range(1, len(sparse_matrix)): for column in range(3): if column == 2: matrix[sparse_matrix[row][0]][sparse_matrix[row][1]] = \ sparse_matrix[row][column]# 3. 打印输出结果print("------sparse_matrix------")print_matrix(sparse_matrix)print("---------------")print("Decompression matrix: sparse_matrix ---> matrix")print("------matrix------")print_matrix(matrix)
# 矩阵异常class MatrixException(Exception): def __init__(self, message, code): self.message = message self.code = code# 打印矩阵def print_matrix(matrix): """ Print matrix. :param matrix: matrix :return: None """ for row in range(len(matrix)): message = "|\t" for column in range(len(matrix[row])): message += str(matrix[row][column]) + "\t" message += "|" print(message) return# --------- 程序开始的地方 ----------# 1. 读入稀疏矩阵,并做校验try: # 稀疏矩阵中存储的非稀疏元素个数 elements_amount = int(input("Total number of input elements: ")) if elements_amount < 0: raise MatrixException("Total number of input elements must more than zero." , 1002) # 稀疏元素的默认值 sparse_element = int(input("Input param sparse_element: ")) # 初始化稀疏矩阵 sparse_matrix = [[sparse_element] * 3 for row in range(elements_amount + 1)] # 记录稀疏矩阵的总行数、总列数 sparse_matrix[0][0] = int(input("Matrix rows: ")) if sparse_matrix[0][0] <= 0: raise MatrixException("Matrix rows must more than zero.", 1003) sparse_matrix[0][1] = int(input("Matrix columns: ")) if sparse_matrix[0][1] <= 0: raise MatrixException("Matrix columns must more than zero.", 1004) sparse_matrix[0][2] = elements_amount # 录入非稀疏元素的信息:所在的行数、所在的列数和值信息 for row in range(1, elements_amount + 1): for column in range(3): sparse_matrix[row][column] = int(input("sparse_matrix[%d][%d]: " % (row, column))) # 记录非稀疏元素在原矩阵中的行数,并做合法性校验 if column == 0: if sparse_matrix[row][column] >= sparse_matrix[0][0] or \ sparse_matrix[row][column] < 0: raise MatrixException("Rows list index out of range.", 1005) # 记录非稀疏元素在原矩阵中的列数,并坐合法性校验 elif column == 1: if sparse_matrix[row][column] >= sparse_matrix[0][1] or \ sparse_matrix[row][column] < 0: raise MatrixException("Columns list index out of range.", 1006) # 记录非稀疏元素的值,并判断值是否与稀疏元素值相等 else: if sparse_matrix[row][column] == sparse_element: raise MatrixException("Invalid elements input.", 1007)except ValueError as e: print("errcode: %s" % str(1001)) print("errmsg: %s" % str(e)) exit(1001)except MatrixException as e: print("errcode: %s" % e.code) print("errmsg: %s" % e.message) exit(e.code)# 2. 解压缩矩阵# 初始化原矩阵rows = sparse_matrix[0][0]columns = sparse_matrix[0][1]matrix = [[sparse_element] * columns for row in range(rows)]# 根据压缩后的稀疏矩阵中提供的信息,将非稀疏元素写入到原矩阵中for row in range(1, len(sparse_matrix)): for column in range(3): if column == 2: matrix[sparse_matrix[row][0]][sparse_matrix[row][1]] = \ sparse_matrix[row][column]# 3. 打印输出结果print("------sparse_matrix------")print_matrix(sparse_matrix)print("---------------")print("Decompression matrix: sparse_matrix ---> matrix")print("------matrix------")print_matrix(matrix)
1. input()函数
2. int()函数
3. range()函数
4. print()函数
输入如下所示的稀疏矩阵。(稀疏元素是0)
6 | 6 | 2 |
2 | 3 | 23 |
1 | 1 | 81 |
输入:
Total number of input elements: 2Input param sparse_element: 0Matrix rows: 6Matrix columns: 6sparse_matrix[1][0]: 2sparse_matrix[1][1]: 3sparse_matrix[1][2]: 23sparse_matrix[2][0]: 1sparse_matrix[2][1]: 1sparse_matrix[2][2]: 81
运行结果:
------sparse_matrix------| 6 6 2 || 2 3 23 || 1 1 81 |---------------Decompression matrix: sparse_matrix ---> matrix------matrix------| 0 0 0 0 0 0 || 0 81 0 0 0 0 || 0 0 0 23 0 0 || 0 0 0 0 0 0 || 0 0 0 0 0 0 || 0 0 0 0 0 0 |
当填充非稀疏矩阵时,如果输入的非稀疏元素值等于稀疏元素值,程序会报错:
录入如下的非稀疏矩阵:注意第一个元素的元素值是0.
6 | 6 | 2 |
2 | 3 | 0 |
1 | 1 | 81 |
运行结果:
Total number of input elements: 2Input param sparse_element: 0Matrix rows: 6Matrix columns: 6sparse_matrix[1][0]: 2sparse_matrix[1][1]: 3sparse_matrix[1][2]: 0errcode: 1007errmsg: Invalid elements input.
当console提示 Total number of input elements:即输入非稀疏元素总数时,若用户输入的是非整数类型的数据,程序会报错:
输入及运行结果:
Total number of input elements: dferrcode: 1001errmsg: invalid literal for int() with base 10: 'df'
⚠️ 其余类似场景均已进行测试,这里不再一一赘述。
转载地址:http://wfsoi.baihongyu.com/