python实现矩阵操作(自造轮子)

没什么说的,这是之前写着玩儿的函数,可以参考着耍耍

from copy import deepcopy


def pretty(matrix):
    # 优化输出

    if isinstance(matrix,str):
        return '矩阵输出失败!'

    row = len(matrix)
    col = len(matrix[0])

    for i in range(row):
        print('|', end=' ')
        for j in range(col):
            print("{:6.3f}".format(matrix[i][j]),end=' ')
        print(' |', end='\n')
    return '计算成功'


def det(matrix):
    # 求行列式的值
    n = len(matrix)
    if n == 2:
        return (matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0])
    if n == 1:
        return matrix[0][0]
    else:
        algebraic_cofactor_list = []  # 储存第一行每个元素的余子式
        for i in range(n):
            cofactor_matrix = []
            for j in range(n - 1):
                cofactor_matrix.append([])
                for k in range(n):
                    if k != i:
                        cofactor_matrix[j].append(matrix[j + 1][k])
            algebraic_cofactor_list.append(det(cofactor_matrix))
        max = 0
        for i in range(n):
            max += ((-1) ** (i)) * algebraic_cofactor_list[i] * matrix[0][i]
        return max

def transposition(old_matrix):
    # 获得转置矩阵
    row = len(old_matrix)
    col = len(old_matrix[0])

    new_matrix = []
    for i in range(col):
        new_matrix.append([])
        for j in range(row):
            new_matrix[i].append(old_matrix[j][i])

    return new_matrix


def adjoint(old_matrix):
    # 获得伴随矩阵
    n = len(old_matrix)
    new_matrix = []
    for x in range(n):
        new_matrix.append([])
        for y in range(n):
            new_matrix[x].append(algebraicCofactorList(x, y, old_matrix))

    return new_matrix


def algebraicCofactorList(x, y, matrix):
    # 获得(x,y)位置的代数余子式

    new_matrix = deepcopy(matrix)
    new_matrix.remove(new_matrix[x])
    for i in range(len(matrix) - 1):
        new_matrix[i].pop(y)  # remove是从头查找与值相同的元素移除,而pop是指定位置移除

    algebraic_cofactor = det(new_matrix) * ((-1) ** (x + y))

    return algebraic_cofactor


def inverseMatrix(matrix):
    # 返回逆矩阵
    try:
        adjoint_matrix = adjoint(transposition(matrix))

        for i in range(len(matrix)):
            for j in range(len(matrix)):
                adjoint_matrix[i][j] /= det(matrix)

        new_matrix = adjoint_matrix

        return new_matrix
    except:
        return '矩阵可能是奇异矩阵,请输入一个新的矩阵!'


if __name__ == '__main__':
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    matrix_1 = [[1, 0, 0], [0, 2, 0], [0, 0, 3]]
    matrix_2 = [[1, 2, 3], [4, 5, 6], [7, 8, 10]]
    # matrix = transposition(matrix)  # 返回转置矩阵
    # print(matrix)
    # pretty(matrix)  # 优化矩阵输出
    # print(det(matrix))  # 求一个矩阵行列式的值
    # print(inverseMatrix(matrix_1))  # 返回逆矩阵

    print(pretty(inverseMatrix(matrix_1)))

输出样例:

|  1.000  0.000  0.000  |
|  0.000  0.500  0.000  |
|  0.000  0.000  0.333  |
计算成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值