3.4 高斯法求逆矩阵

  首先必须要判断矩阵是不是一个方阵。然后把在矩阵右边放一个单位矩阵,然后再进行行变换,左边变成单位矩阵后吗,右边的矩阵就是逆矩阵。
  举个例子,以下矩阵:
[ 1 1 1 1 2 1 1 1 − 1 2 1 1 − 3 2 1 2 ] \left[\begin{matrix} 1 & 1 & 1 & 1\\ 2 & 1& 1& 1\\ -1 & 2& 1& 1\\ -3& 2& 1& 2\\ \end{matrix}\right] 1213112211111112
  右接一个单位矩阵
[ 1 1 1 1 1 0 0 0 2 1 1 1 0 1 0 0 − 1 2 1 1 0 0 1 0 − 3 2 1 2 0 0 0 1 ] \left[\begin{matrix} 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0\\ 2 & 1& 1& 1 & 0 & 1 & 0 & 0\\ -1 & 2& 1& 1 & 0 & 0 & 1 & 0\\ -3& 2& 1& 2 & 0 & 0 & 0 & 1\\ \end{matrix}\right] 12131122111111121000010000100001
  进行行变换
[ 1 1 1 1 1 0 0 0 0 1 1 1 2 − 1 0 0 0 0 − 1 − 1 − 5 3 1 0 0 0 0 1 − 2 2 − 1 1 ] \left[\begin{matrix} 1& 1 & 1 &1 & 1 & 0 & 0 &0\\ 0& 1 & 1 &1& 2 &-1 & 0& 0\\ 0 &0 &-1 &-1 &-5 &3 &1 &0\\ 0 &0& 0& 1& -2& 2 &-1& 1\\ \end{matrix}\right] 10001100111011111252013200110001
  单位化,就变成这样了:
[ 1 0 0 0 − 1 1 0 0 0 1 0 0 − 3 2 1 0 0 0 1 0 7 − 5 0 − 1 0 0 0 1 − 2 2 − 1 1 ] \left[\begin{matrix} 1 & 0 & 0 & 0 & -1 & 1 & 0 & 0\\ 0 & 1 & 0 & 0 & -3 & 2 & 1 & 0\\ 0 & 0 & 1 & 0 & 7 & -5 & 0 & -1\\ 0 & 0 & 0 & 1 & -2 & 2 & -1 & 1\\ \end{matrix}\right] 10000100001000011372125201010011
  Java代码:

public Matrix<T> inverse() {
    // 必须是个方阵
    if (this.array.length != this.array[0].length) {
        throw new IllegalArgumentException("方阵才有双侧逆矩阵");
    }
    // 创建一个矩阵,单位矩阵放在右边
    final T[][] newArray = newArray(this.array.length, this.array.length << 1);
    for (int i = 0; i < newArray.length; i++) {
        final T[] line = newArray[i];
        final T[] thisLine = this.array[i];
        for (int j = 0; j < thisLine.length; j++) {
            line[j] = thisLine[j];
        }
        for (int j = thisLine.length; j < line.length; j++) {
            if (j == thisLine.length + i) {
                line[j] = oneValue();
            } else {
                line[j] = zeroValue();
            }
        }
    }
    return createMatrix(newArray).toUpperTriangular().toLowerTriangle().toUnipotent()
        .subMatrix(0, this.array.length, this.array.length, this.array.length * 2);
}

  python代码:

def __invert__(self):
    # 首先新建一个单位矩阵
    size = len(self.__lines)
    unit = self.unit_matrix(size)
    new_matrix = self.append(unit)
    new_matrix.to_upper_triangle()
    new_matrix.to_lower_triangle()
    new_matrix.to_unipotent()
    return new_matrix.sub_matrix(0, size, 0, size)

# 创建单位矩阵方法
# 简化后如下:
@staticmethod
def unit_matrix(size):
    return [[1 if i == j else 0 for j in range(0, size)] for i in range(0, size)]

# 拼接矩阵方法
def append(self, matrix):
    # define an array
    rows = len(self.__lines)
    columns = len(self.__lines[0]) + len(matrix.__lines[0])
    unit = [[0 for _ in range(0, columns)] for _ in range(0, rows)]
    for y in range(0, len(unit)):
        self_line = self.__lines[y]
        other_line = matrix.__lines[y]
        # 0~ this this ~other
        for i in range(0, len(self_line)):
            unit[y][i] = self_line[i]

        for i in range(0, len(other_line)):
            unit[y][i+len(self_line)] = other_line[i]
    return Matrix(unit)
# 下三角矩阵方法
def to_lower_triangle(self):
    for i in range(len(self.__lines) - 1, -1, -1):
        # 循环遍历其前的所有行, 其前所有行进行改变
        for j in range(0, i):
            Matrix.row_operate(self.__lines[i], self.__lines[j], self.__lines[j][i], self.__lines[i][i],
                               0, len(self.__lines[i]))

# 单位矩阵方法
def to_unipotent(self):
    for i in range(0, len(self.__lines)):
        line = self.__lines[i]
        for j in range(0, len(line)):
            if i != j and line[i] != 0:
                line[j] /= line[i]
# 行变换方法
@staticmethod
def __row_operate(line1, line2, coefficient1, coefficient2, start_column, end_column):
    for i in range(start_column, end_column):
        line2[i] = line1[i] * coefficient1 - line2[i] * coefficient2
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值