核心概述

矩阵求逆(Matrix Inverse):对非奇异方阵 A 求 A^{-1} 使 A·A^{-1}=I,常用高斯–约当消元法,实数域配部分主元,模素数域用逆元,时间复杂度 O(n^3)。

原文引述

Description: Compute A^{-1} via Gauss–Jordan elimination (row operations) in-place. Requires det(A)≠0. Over reals: partial pivoting; over modulo prime: use modular inverses. Time: O(n^3) Status: tested ——摘自本节点现有英文注释

展开阐述

  • 函数/接口(据实现)

    • template vector<vector> inv(vector<vector> A)
      • 输入 n×n 矩阵 A,若可逆返回 A^{−1};否则可抛异常或返回空。
    • bool invertible(const Mat& A):返回 A 是否可逆(可选)。
    • 依赖:模数域下的 088-数论-模逆091-数论-模幂094-数论-模运算;实数域的数值稳定技巧。
  • 核心算法(Gauss–Jordan)

    1. 构造增广矩阵 [A | I](n×2n)。
    2. 对 i = 0..n−1:
      • 选取主元行 p(|A[p][i]| 最大或任一非零);若 A[p][i]=0 ⇒ A 奇异。
      • 若 p≠i,交换第 i 与 p 行(实数版需记录行交换符号,但求逆不关心 det)。
      • 将主元缩放为 1:第 i 行除以 piv(模域乘 inv(piv),实数域乘 1/piv)。
      • 对所有 j≠i,消去第 j 行的第 i 列:row_j ← row_j − A[j][i]·row_i。
    3. 最终左侧变为 I,右侧即为 A^{−1}(原地操作时直接覆盖原矩阵)。
  • 数值与实现注意

    • 实数域:
      • 部分主元(按列最大值)选主元,避免除以小数。
      • 浮点误差可能导致“接近奇异”矩阵;对病态矩阵应改用 SVD 或 QR。
      • 结果可再乘 A 检查是否接近 I。
    • 模数域(素数 p):
    • 原地实现:
      • 可以用两个矩阵或原地增广;原地可节省内存但增加复杂度。
  • 输出语义

    • 返回 n×n 矩阵 B,若 A 可逆则 B=A^{−1};否则返回空或报错。
  • 复杂度

    • O(n^3) 次乘加/除法;空间 O(n^2)(原地增广)或 O(n^2) 临时。
  • 使用与注意

关联节点