📜  门| GATE-CS-2016(套装1)|问题 6(1)

📅  最后修改于: 2023-12-03 14:58:31.306000             🧑  作者: Mango

问题6

该问题是关于矩阵的互逆性的。在数学中,如果两个矩阵乘积的结果是单位矩阵,则这两个矩阵互为逆矩阵。该问题要求找到逆矩阵。

输入格式

输入包含一个整数 $n$,它表示矩阵的阶数。接下来的 $n$ 行包含矩阵 $A$ 的元素。

输出格式

输出矩阵 $A$ 的逆矩阵。如果矩阵不可逆,则输出 $-1$。

思路

矩阵的逆矩阵存在的充要条件是矩阵行列式不为 $0$。因此,我们可以先求解矩阵的行列式,若行列式为零则输出 $-1$,否则继续计算逆矩阵。

可以使用高斯-约旦消元法求解逆矩阵,步骤如下:

  1. 将 $A$ 扩展为一个 $n \times 2n$ 的矩阵,矩阵右侧为 $n \times n$ 的单位矩阵。
  2. 对 $A$ 进行初等行变换,将左侧部分变换为单位矩阵,此时右侧部分即为矩阵 $A$ 的逆矩阵。
代码实现
def gauss_jordan(A, n):
    B = [[0] * 2 * n for _ in range(n)]
    for i in range(n):
        B[i] = A[i] + [int(j == i) for j in range(n)]

    for i in range(n):
        if B[i][i] == 0:
            return -1
        for j in range(i + 1, n):
            coef = B[j][i] / B[i][i]
            for k in range(2 * n):
                B[j][k] -= coef * B[i][k]
    
    for i in range(n - 1, -1, -1):
        coef = B[i][i]
        for j in range(i + 1, 2 * n):
            B[i][j] /= coef
        B[i][i] = 1
        for j in range(i):
            coef = B[j][i]
            for k in range(i, 2 * n):
                B[j][k] -= coef * B[i][k]
    
    return [B[i][n:] for i in range(n)]
参考链接