算法知识图谱总览 / 线性代数族 / 矩阵秩

矩阵秩

P2advancedstandardG-C-14

What · 是什么

高斯消元求矩阵秩,线性无关向量组最大个数

矩阵的秩是其行向量(或列向量)的极大线性无关组的大小,即线性无关向量组的最大个数。行秩=列秩=矩阵秩。通过高斯消元将矩阵化为行阶梯形,非零行数即为秩。满秩方阵可逆。秩等于矩阵标准形中1的个数。在向量空间中,秩=向量组张成空间的维数。

Why · 为什么

直觉 · Intuition

秩衡量矩阵'有效信息量'。秩=2意味着第三行(或第三列)可由前两行线性表出,是'多余'的。秩越小,矩阵越'退化'。

原理 · Principle

高斯消元不改变矩阵的行空间(行向量张成的空间),消元后的非零行数即为秩。模质数时用逆元消元,浮点时用除法消元。

历史 · History

秩的概念由Frobenius在1879年系统化。行秩=列秩是线性代数基本定理。

How · 实现

伪代码

rank = 0
for col in 0..m-1:
  find pivot in rows rank..n-1
  if none: continue
  swap to rank, normalize, eliminate
  rank++
return rank

Python 实现

def matrix_rank(mat, mod=None):
    """Compute rank of a matrix via Gaussian elimination."""
    if not mat or not mat[0]:
        return 0
    n, m = len(mat), len(mat[0])
    A = [row[:] for row in mat]
    rank = 0
    for col in range(m):
        if rank >= n:
            break
        pivot = -1
        for row in range(rank, n):
            val = A[row][col]
            if mod:
                val %= mod
            if val != 0:
                pivot = row
                break
        if pivot == -1:
            continue
        A[rank], A[pivot] = A[pivot], A[rank]
        if mod:
            inv = pow(A[rank][col] % mod, mod - 2, mod)
            for j in range(m):
                A[rank][j] = A[rank][j] * inv % mod
            for r in range(n):
                if r != rank and A[r][col] % mod != 0:
                    factor = A[r][col]
                    for j in range(m):
                        A[r][j] = (A[r][j] - factor * A[rank][j]) % mod
        else:
            piv = A[rank][col]
            for j in range(m):
                A[rank][j] /= piv
            for r in range(n):
                if r != rank and abs(A[r][col]) > 1e-9:
                    factor = A[r][col]
                    for j in range(m):
                        A[r][j] -= factor * A[rank][j]
        rank += 1
    return rank

if __name__ == "__main__":
    assert matrix_rank([[1, 2, 3], [2, 4, 6], [1, 1, 1]]) == 2
    assert matrix_rank([[1, 0], [0, 1]]) == 2
    assert matrix_rank([[1, 2], [2, 4]]) == 1
    assert matrix_rank([[0, 0], [0, 0]]) == 0
    assert matrix_rank([[1]]) == 1
    # Mod arithmetic
    assert matrix_rank([[1, 2], [2, 4]], mod=10**9 + 7) == 1
    assert matrix_rank([[1, 2], [3, 4]], mod=10**9 + 7) == 2
    print("matrix-rank: ALL TESTS PASSED")
PyPy 提示模质数秩计算比浮点快(无精度问题)。纯Python三层循环n>100可能慢。
时间复杂度O(n*m*min(n,m))
空间复杂度O(n*m)
注意 · 局限浮点精度影响零行判断。模非质数需辗转相消法。

易错点

例题

OJ题号难度考点链接
LuoguP33894高斯消元中秩判断是核心https://www.luogu.com.cn/problem/P3389
上游 · 本知识点依赖(前置/变体/组合/共现)

信源

✓ = 已核验 · △ = 未核验