博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左下三角矩阵压缩(Python)
阅读量:4188 次
发布时间:2019-05-26

本文共 6111 字,大约阅读时间需要 20 分钟。

目录


 

导语

下三角矩阵就是一种对角线以上元素都为0的 n x n矩阵。其中左下三角矩阵是指对角线以上的元素都为0。

由于下三角矩阵仍然有大量元素为0,为了避免浪费太多的内存空间,可以把三角矩阵的二维模式存储在一维列表中。

 

a_{11} 0 0 0 0
a_{21} a_{22} 0 0 0
a_{31} a_{32} a_{33} 0 0
... ... ... ... 0
a_{n1} a_{n2} a_{n3} ... a_{nn}

对于如上所示的 n x n左下三角矩阵A(ij),如果i < j,那么对应位置的元素值为0。

 

解决方案

由于采用Python解决这个问题,一维列表不需要实现声明大小。将该矩阵的有效元素映射为一维列表存储有两种解决方案,映射方式分为以行为主和以列为主两种方式。

1. 以行为主的存储映射

以行为主的存储方案是先将左下三角矩阵的第一行对角线及对角线以下的元素存储在一维列表中,然后在将左下三角矩阵的第二行对角线及对角线以下的元素存储在一维列表中。。。以此类推存储每一行元素。这样存储的一维列表中包含了左下三角矩阵中全部的有效元素。

a_{11} a_{21} a_{22} a_{31} a_{32} a_{33} ... a_{n1} a_{n2} a_{n3} ... a_{nn}

由上图可知a_{ij}在一维数组中所对应的索引值k的对应关系为:

k = n \cdot (j - 1) + i - \frac{j(j-1)}{2}

2. 以列为主的存储映射

同理,以列为主的存储如图:

a_{11}
a_{21}
a_{31}
...
a_{n1}
...
a_{ij}
...
...
a_{nn}

由上图可知a_{ij}在一维数组中所对应的索引值k的对应关系为:

k = n \cdot (j - 1) + i - \frac{j(j-1)}{2}


无论选择哪一种存储映射,都可以将左下三角矩阵压缩为一个一维列表。本文选用以列为主的存储映射举例说明

 

示例题目

1. 题目描述

设计一个Python程序,输入一个左下三角矩阵,输出压缩后的一维数组。

 

2. 输入/输出 描述

输入描述

输入左下三角矩阵的总行数、默认数字,然后自动计算大小,提示输入对应的数字。

Input matrix rows: 5Input default value: 0lower_triangular_matrix[0][0]: 34lower_triangular_matrix[1][0]: 25lower_triangular_matrix[1][1]: 39lower_triangular_matrix[2][0]: 21lower_triangular_matrix[2][1]: 23lower_triangular_matrix[2][2]: 1lower_triangular_matrix[3][0]: 98lower_triangular_matrix[3][1]: 2lower_triangular_matrix[3][2]: 56lower_triangular_matrix[3][3]: 4lower_triangular_matrix[4][0]: 59lower_triangular_matrix[4][1]: 0lower_triangular_matrix[4][2]: 2lower_triangular_matrix[4][3]: 11lower_triangular_matrix[4][4]: 3

输出描述:

输出原左下三角矩阵和压缩成一维列表后的矩阵。

------lower triangular matrix------|	34	0	0	0	0	||	25	39	0	0	0	||	21	23	1	0	0	||	98	2	56	4	0	||	59	0	2	11	3	|------compress lower triangular matrix --> list ------[34, 25, 39, 21, 23, 1, 98, 2, 56, 4, 59, 0, 2, 11, 3]

 

3. 代码

class MatrixException(Exception):    def __init__(self, message, code):        self.message = message        self.code = code# 1. 输入一个左下三角矩阵try:    rows = int(input("Input matrix rows: "))    if rows <= 0:        raise MatrixException("Matrix rows can not less than zero.", 1002)    columns = rows    default_value = int(input("Input default value: "))    ltm = [[default_value] * columns for row in range(rows)]    for row in range(rows):        for column in range(columns):            if column <= row:                ltm[row][column] = int(input("lower_triangular_matrix[%d][%d]: "                                             % (row, column)))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. 压缩左下三角矩阵try:    array_size = ((1 + rows) * rows) // 2    compress = [None] * array_size    pos = 0    for row in range(rows):        for column in range(columns):            if column <= row:                compress[pos] = ltm[row][column]                pos += 1    if None in compress:        print("compress: %s" % compress)        raise MatrixException("Compress upper triangular matrix failed.", 1002)except MatrixException as e:    print("errcode: %s" % e.code)    print("errmsg: %s" % e.message)    exit(e.code)# 3. 打印结果print("------lower triangular matrix------")for row in range(rows):    message = "|\t"    for column in range(columns):        message += str(ltm[row][column]) + "\t"    message += "|"    print(message)print("------compress lower triangular matrix --> list ------")print(compress)

 

4. 代码走读

# 自定义异常class MatrixException(Exception):    def __init__(self, message, code):        self.message = message        self.code = code# 1. 输入一个左下三角矩阵try:    # 输入左下三角矩阵的行数,列数等于行数    rows = int(input("Input matrix rows: "))    if rows <= 0:        raise MatrixException("Matrix rows can not less than zero.", 1002)    columns = rows    # 输入默认数字    default_value = int(input("Input default value: "))    # 初始化左下三角矩阵    ltm = [[default_value] * columns for row in range(rows)]    for row in range(rows):        for column in range(columns):            if column <= row:                ltm[row][column] = int(input("lower_triangular_matrix[%d][%d]: "                                             % (row, column)))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. 压缩左下三角矩阵,使用以列为主的存储映射try:    array_size = ((1 + rows) * rows) // 2    compress = [None] * array_size    pos = 0    for row in range(rows):        for column in range(columns):            if column <= row:                compress[pos] = ltm[row][column]                pos += 1    if None in compress:        print("compress: %s" % compress)        raise MatrixException("Compress upper triangular matrix failed.", 1002)except MatrixException as e:    print("errcode: %s" % e.code)    print("errmsg: %s" % e.message)    exit(e.code)# 3. 打印结果print("------lower triangular matrix------")for row in range(rows):    message = "|\t"    for column in range(columns):        message += str(ltm[row][column]) + "\t"    message += "|"    print(message)print("------compress lower triangular matrix --> list ------")print(compress)

 

5. 测试用例

A. 正常使用场景

Input matrix rows: 6Input default value: 0lower_triangular_matrix[0][0]: 34lower_triangular_matrix[1][0]: 12lower_triangular_matrix[1][1]: 5lower_triangular_matrix[2][0]: 9lower_triangular_matrix[2][1]: -3lower_triangular_matrix[2][2]: 23lower_triangular_matrix[3][0]: 51lower_triangular_matrix[3][1]: -24lower_triangular_matrix[3][2]: 3lower_triangular_matrix[3][3]: 1lower_triangular_matrix[4][0]: 40lower_triangular_matrix[4][1]: 22lower_triangular_matrix[4][2]: 7lower_triangular_matrix[4][3]: 92lower_triangular_matrix[4][4]: 99lower_triangular_matrix[5][0]: 76lower_triangular_matrix[5][1]: 29lower_triangular_matrix[5][2]: -26lower_triangular_matrix[5][3]: -2lower_triangular_matrix[5][4]: 3lower_triangular_matrix[5][5]: 6------lower triangular matrix------|	34	0	0	0	0	0	||	12	5	0	0	0	0	||	9	-3	23	0	0	0	||	51	-24	3	1	0	0	||	40	22	7	92	99	0	||	76	29	-26	-2	3	6	|------compress lower triangular matrix --> list ------[34, 12, 5, 9, -3, 23, 51, -24, 3, 1, 40, 22, 7, 92, 99, 76, 29, -26, -2, 3, 6]

B. 输入的数据不是整数

Input matrix rows: kerrcode: 1001errmsg: invalid literal for int() with base 10: 'k'

C. 输入的矩阵行数不大于0

Input matrix rows: 0errcode: 1002errmsg: Matrix rows can not less than zero.

 

6. 传送门

转载地址:http://ybsoi.baihongyu.com/

你可能感兴趣的文章
Qt中文件读取的几种方式
查看>>
pyqt实现界面化编程
查看>>
qt写DLL文件并调用和出现的问题分析
查看>>
工厂模式(Factory)-设计模式(一)
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
Qt 怎么给QWidget添加滚动条
查看>>
双十一冲刺业绩,完不成杀运营祭天?程序员:你们也有今天
查看>>
搜狗输入法到底算不算恶意挟持百度搜索流量?五个测试告诉你答案
查看>>
百度成为美国领先的人工智能联盟的第一个中国成员
查看>>
程序员资讯:QR代码在公共交通中得到越来越多的采用
查看>>
当了将近十年的程序员,为什么从来没见过程序员带孩子
查看>>
程序员面试中最容易碰到的五个套路!应届生最容易上当
查看>>
三种不同的程序员,你属于哪一种?如果要裁员,你会让谁走?
查看>>
干货神总结,程序员面试技巧
查看>>
深度解析BAT三家互联网公司,为什么腾讯产品第一,百度技术第一,阿里运营第一?
查看>>
程序员发贴求助:剪短头发能缓解脱发吗?网友:我觉得秃头挺好的
查看>>
史上最难程序员的面试题!谷歌、百度、微软、阿里必答题
查看>>
为什么会出现“程序员千万不要学算法”这种言论?
查看>>
程序员如何做到快速升职?这几点你都做到了吗?
查看>>
第五届世界互联网大会重点介绍工业互联网
查看>>