博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 解压稀疏矩阵
阅读量:4190 次
发布时间:2019-05-26

本文共 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()函数

 

测试用例

1. 正常场景

输入如下所示的稀疏矩阵。(稀疏元素是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	|

 

2. 异常场景 · 录入的非稀疏元素等于稀疏元素

当填充非稀疏矩阵时,如果输入的非稀疏元素值等于稀疏元素值,程序会报错:

录入如下的非稀疏矩阵:注意第一个元素的元素值是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.

 

3. 异常场景 · 输入的元素总数数值不是整数类型

当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/

你可能感兴趣的文章
程序员准时下班碰见领导,次月发工资时看到绩效莫名被扣20%
查看>>
你见过最牛逼的程序员是什么样的?拳打回车键,脚踩Emacs编辑器
查看>>
相比加班的程序员,企业更喜欢“偷懒”的程序员?程序员偷的不是懒,是高效!
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Linux网络运维-SSH
查看>>
Linux网络运维 -- 配置DHCP服务器
查看>>
Android开发问题记录
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>
图像调优3: CCM参数的标定
查看>>
ctags在verilog代码浏览中的应用
查看>>