python 对称矩阵压缩及还原

正常情况下,矩阵的存储需要消耗n*n个存储单元,而对称存储只需要n×(n+1)/2个存储单元。当n较大时,节省下的存储单元十分可观。

借助numpy生成矩阵,在python中的实现代码:

import numpy as np

# 矩阵的阶数
N = 5


def get_matrix():
    """
    创建一个5x5的随机整数矩阵
    :return:
    """
    return np.random.randint(1, 5, size=(N, N))


def tri(matrix, method="low"):
    """
    保留矩阵的上三角或下三角
    :param matrix:
    :param method:
    :return:
    """
    return np.tril(matrix) if method == "low" else np.triu(matrix)


def diag(matrix):
    """
    生成对称矩阵
    :param matrix:
    :return:
    """
    return matrix + matrix.T - np.diag(matrix.diagonal())


def init_list():
    """
    根据矩阵维度生成一个一维数组存储对称矩阵数据
    :return:
    """
    return [0] * (int((N + 1) * N / 2))


def get_index(x, y):
    """
    根据x,y获取对应列表中的索引, 计算公式为: x>=y时 x(x+1)/2 + y, x= y:
        return x * (x + 1) // 2 + y
    return y * (y + 1) // 2 + x


def save_to_list(index_array, r_list, r_mt):
    """
    将数据存储到一维数组中
    :param index_array:
    :param r_list:
    :param r_mt:
    :return:
    """
    for index in range(len(r_list)):
        x, y = index_array[1][index], index_array[0][index]
        r_list[get_index(x, y)] = r_mt[y][x]
    return r_list


def list_to_matrix(r_list):
    """
    将数组还原为对称矩阵
    :param r_list:
    :return:
    """
    new_matrix = np.zeros((N, N), dtype=int)
    new_matrix_index = np.where(new_matrix == 0)
    for index in range(len(new_matrix_index[0])):
        x, y = new_matrix_index[1][index], new_matrix_index[0][index]
        new_matrix[y, x] = r_list[get_index(x, y)]
    return new_matrix


if __name__ == '__main__':
    mt = get_matrix()
    low_mt = tri(mt)
    diag_mt = diag(low_mt)
    print("生成的对称矩阵为:\n%s" % diag_mt)

    low_diag_mt = tri(diag_mt)
    print("保留下三角的矩阵数据: \n%s" % low_diag_mt)

    no_zero_index = np.nonzero(low_diag_mt)

    i_list = init_list()
    print("根据维度初始化的数组长度为: \n%s" % len(i_list))

    res_list = save_to_list(no_zero_index, i_list, low_diag_mt)
    print("存储后的数组为:\n%s" % res_list)

    res_matrix = list_to_matrix(res_list)
    print("还原后的对称矩阵为: \n %s" % res_matrix)

运行结果:


image.png

你可能感兴趣的:(python 对称矩阵压缩及还原)