跳转至

线性代数(二)矩阵及其运算

章节概述

矩阵是线性代数的核心概念,是描述线性变换和线性方程组的重要工具。本章将介绍矩阵的定义、运算、逆矩阵、秩以及应用。

学习目标

  • 理解矩阵的定义和表示
  • 掌握矩阵的基本运算
  • 学会求逆矩阵
  • 理解矩阵的秩的概念
  • 了解矩阵的应用

(一)矩阵的定义

矩阵的定义

m×n 矩阵是由 m 行 n 列的数排成的矩形数组:

A = |a₁₁ a₁₂ ... a₁ₙ|
    |a₂₁ a₂₂ ... a₂ₙ|
    |...              |
    |aₘ₁ aₘ₂ ... aₘₙ|

特殊矩阵

1. 方阵:m = n 的矩阵

2. 对角矩阵:非对角线元素都为零的方阵

3. 单位矩阵:对角线元素为 1 的对角矩阵,记作 I

4. 零矩阵:所有元素都为零的矩阵

5. 对称矩阵:Aᵀ = A 的方阵

6. 反对称矩阵:Aᵀ = -A 的方阵

Python 实现

def create_matrix(m, n, value=0):
    """
    创建 m×n 矩阵

    参数:
        m: 行数
        n: 列数
        value: 初始值

    返回:
        list: m×n 矩阵
    """
    return [[value for _ in range(n)] for _ in range(m)]

def identity_matrix(n):
    """
    创建 n×n 单位矩阵

    参数:
        n: 阶数

    返回:
        list: n×n 单位矩阵

    示例:
        >>> identity_matrix(3)
        [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    """
    return [[1 if i == j else 0 for j in range(n)] for i in range(n)]

def transpose(matrix):
    """
    计算矩阵的转置

    参数:
        matrix: 输入矩阵

    返回:
        list: 转置矩阵

    示例:
        >>> A = [[1, 2], [3, 4]]
        >>> transpose(A)
        [[1, 3], [2, 4]]
    """
    m = len(matrix)
    n = len(matrix[0])
    return [[matrix[j][i] for j in range(m)] for i in range(n)]

实例分析

实例1:创建特殊矩阵

# 3×3 零矩阵
zero_matrix = create_matrix(3, 3)
print("零矩阵:")
for row in zero_matrix:
    print(row)

# 3×3 单位矩阵
I = identity_matrix(3)
print("\n单位矩阵:")
for row in I:
    print(row)

实例2:矩阵转置

A = [[1, 2, 3],
     [4, 5, 6]]

A_T = transpose(A)
print("原矩阵:")
for row in A:
    print(row)

print("\n转置矩阵:")
for row in A_T:
    print(row)

(二)矩阵运算

1. 矩阵加法

两个同型矩阵相加,对应元素相加:

C = A + B,cᵢⱼ = aᵢⱼ + bᵢⱼ

2. 矩阵数乘

矩阵与数相乘,每个元素都乘以该数:

C = k·A,cᵢⱼ = k·aᵢⱼ

3. 矩阵乘法

m×n 矩阵 A 与 n×p 矩阵 B 相乘,得到 m×p 矩阵 C:

cᵢⱼ = Σ(k=1 to n) aᵢₖ·bₖⱼ

注意:矩阵乘法不满足交换律,即 AB ≠ BA

Python 实现

def matrix_add(A, B):
    """
    矩阵加法

    参数:
        A: 第一个矩阵
        B: 第二个矩阵

    返回:
        list: A + B

    示例:
        >>> A = [[1, 2], [3, 4]]
        >>> B = [[5, 6], [7, 8]]
        >>> matrix_add(A, B)
        [[6, 8], [10, 12]]
    """
    m = len(A)
    n = len(A[0])
    return [[A[i][j] + B[i][j] for j in range(n)] for i in range(m)]

def matrix_scalar_multiply(k, A):
    """
    矩阵数乘

    参数:
        k: 数
        A: 矩阵

    返回:
        list: k·A

    示例:
        >>> A = [[1, 2], [3, 4]]
        >>> matrix_scalar_multiply(2, A)
        [[2, 4], [6, 8]]
    """
    return [[k * A[i][j] for j in range(len(A[0]))] for i in range(len(A))]

def matrix_multiply(A, B):
    """
    矩阵乘法

    参数:
        A: 第一个矩阵 (m×n)
        B: 第二个矩阵 (n×p)

    返回:
        list: A·B (m×p)

    示例:
        >>> A = [[1, 2], [3, 4]]
        >>> B = [[5, 6], [7, 8]]
        >>> matrix_multiply(A, B)
        [[19, 22], [43, 50]]
    """
    m = len(A)
    n = len(A[0])
    p = len(B[0])

    result = [[0 for _ in range(p)] for _ in range(m)]

    for i in range(m):
        for j in range(p):
            for k in range(n):
                result[i][j] += A[i][k] * B[k][j]

    return result

# 使用 NumPy 进行高效计算
def matrix_multiply_numpy(A, B):
    """
    使用 NumPy 进行矩阵乘法

    参数:
        A: 第一个矩阵
        B: 第二个矩阵

    返回:
        numpy.ndarray: A·B
    """
    import numpy as np
    return np.dot(np.array(A), np.array(B))

实例分析

实例1:矩阵加法

A = [[1, 2], [3, 4]]
B = [[5, 6], [7, 8]]

C = matrix_add(A, B)
print("A + B:")
for row in C:
    print(row)

实例2:矩阵乘法

A = [[1, 2, 3],
     [4, 5, 6]]

B = [[7, 8],
     [9, 10],
     [11, 12]]

C = matrix_multiply(A, B)
print("A·B:")
for row in C:
    print(row)

# 输出:
# [58, 64]
# [139, 154]

实例3:矩阵乘法不满足交换律

A = [[1, 2], [3, 4]]
B = [[5, 6], [7, 8]]

AB = matrix_multiply(A, B)
BA = matrix_multiply(B, A)

print("A·B:")
for row in AB:
    print(row)

print("\nB·A:")
for row in BA:
    print(row)

print("\nAB == BA:", AB == BA)  # False

(三)逆矩阵

逆矩阵的定义

对于 n×n 方阵 A,如果存在 n×n 矩阵 B,使得:

A·B = B·A = I
则称 B 为 A 的逆矩阵,记作 A⁻¹

逆矩阵存在的条件

定理:方阵 A 可逆的充分必要条件是 det(A) ≠ 0

逆矩阵的计算

伴随矩阵法:

A⁻¹ = (1/det(A))·adj(A)

其中 adj(A) 是 A 的伴随矩阵。

Python 实现

def inverse_matrix(A):
    """
    计算逆矩阵(伴随矩阵法)

    参数:
        A: n×n 方阵

    返回:
        list: A⁻¹

    示例:
        >>> A = [[1, 2], [3, 4]]
        >>> inverse_matrix(A)
        [[-2.0, 1.0], [1.5, -0.5]]
    """
    import numpy as np

    A_np = np.array(A, dtype=float)
    det = np.linalg.det(A_np)

    if abs(det) < 1e-10:
        raise ValueError("矩阵不可逆")

    # 计算逆矩阵
    A_inv = np.linalg.inv(A_np)
    return A_inv.tolist()

def is_inverse(A, B, tolerance=1e-10):
    """
    验证 B 是否为 A 的逆矩阵

    参数:
        A: 原矩阵
        B: 待验证矩阵
        tolerance: 容差

    返回:
        bool: 如果是逆矩阵返回 True
    """
    import numpy as np
    A_np = np.array(A, dtype=float)
    B_np = np.array(B, dtype=float)

    AB = np.dot(A_np, B_np)
    BA = np.dot(B_np, A_np)
    I = np.eye(len(A))

    return (np.allclose(AB, I, atol=tolerance) and
            np.allclose(BA, I, atol=tolerance))

实例分析

实例:计算逆矩阵

A = [[1, 2],
     [3, 4]]

try:
    A_inv = inverse_matrix(A)
    print("A⁻¹:")
    for row in A_inv:
        print(row)

    # 验证
    print(f"\n验证: {is_inverse(A, A_inv)}")

except ValueError as e:
    print(f"错误: {e}")

(四)矩阵的秩

秩的定义

矩阵 A 的秩记作 rank(A),是指 A 中线性无关的行(或列)的最大数目。

秩的性质

性质1:rank(A) ≤ min(m, n),其中 A 是 m×n 矩阵

性质2:rank(A) = rank(Aᵀ)

性质3:rank(A·B) ≤ min(rank(A), rank(B))

性质4:如果 A 可逆,则 rank(A·B) = rank(B)

Python 实现

def matrix_rank(A, tolerance=1e-10):
    """
    计算矩阵的秩

    参数:
        A: 输入矩阵
        tolerance: 容差

    返回:
        int: 矩阵的秩

    示例:
        >>> A = [[1, 2], [3, 4]]
        >>> matrix_rank(A)
        2
    """
    import numpy as np
    A_np = np.array(A, dtype=float)
    return np.linalg.matrix_rank(A_np, tol=tolerance)

def is_full_rank(A):
    """
    判断矩阵是否满秩

    参数:
        A: 输入矩阵

    返回:
        bool: 如果满秩返回 True
    """
    m, n = len(A), len(A[0])
    rank = matrix_rank(A)
    return rank == min(m, n)

实例分析

实例1:计算矩阵的秩

A = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

rank_A = matrix_rank(A)
print(f"rank(A) = {rank_A}")  # 输出: 2

B = [[1, 0, 0],
     [0, 1, 0],
     [0, 0, 1]]

rank_B = matrix_rank(B)
print(f"rank(B) = {rank_B}")  # 输出: 3

实例2:判断是否满秩

C = [[1, 2], [3, 4]]
print(f"矩阵 C 是否满秩: {is_full_rank(C)}")  # True

D = [[1, 2], [2, 4]]
print(f"矩阵 D 是否满秩: {is_full_rank(D)}")  # False

(五)矩阵的应用

1. 线性变换

矩阵可以表示线性变换。例如,旋转矩阵:

R(θ) = |cos θ -sin θ|
       |sin θ  cos θ|

def rotation_matrix(theta):
    """
    创建 2D 旋转矩阵

    参数:
        theta: 旋转角度(弧度)

    返回:
        list: 旋转矩阵

    示例:
        >>> R = rotation_matrix(math.pi/4)
    """
    import math
    return [[math.cos(theta), -math.sin(theta)],
            [math.sin(theta), math.cos(theta)]]

# 示例:旋转点 (1, 0) 90度
import math
R = rotation_matrix(math.pi/2)
point = [1, 0]
rotated_point = matrix_multiply(R, [[p] for p in point])
print(f"旋转后的点: {[rotated_point[0][0], rotated_point[1][0]]}")  # [0, 1]

2. 图像处理

矩阵在图像处理中有广泛应用,如图像旋转、缩放等。

3. 网络分析

邻接矩阵用于表示图的结构,矩阵乘法可以用于计算路径数量。

def adjacency_matrix(edges, n):
    """
    创建邻接矩阵

    参数:
        edges: 边列表 [(i, j), ...]
        n: 顶点数

    返回:
        list: 邻接矩阵
    """
    A = create_matrix(n, n)
    for i, j in edges:
        A[i][j] = 1
        A[j][i] = 1  # 无向图
    return A

def path_count(A, k):
    """
    计算长度为 k 的路径数量

    参数:
        A: 邻接矩阵
        k: 路径长度

    返回:
        numpy.ndarray: 路径数量矩阵
    """
    import numpy as np
    A_np = np.array(A, dtype=float)
    return np.linalg.matrix_power(A_np, k)

# 示例
edges = [(0, 1), (1, 2), (2, 0)]
A = adjacency_matrix(edges, 3)

print("邻接矩阵:")
for row in A:
    print(row)

# 计算 2 步路径数量
paths_2 = path_count(A, 2)
print("\n2 步路径数量:")
for row in paths_2:
    print(row)

实战练习

练习1:矩阵运算

给定矩阵 A 和 B,计算 A + B, A·B, Aᵀ

A = [[1, 2, 3],
     [4, 5, 6]]

B = [[7, 8, 9],
     [10, 11, 12]]

# 矩阵加法
C = matrix_add(A, B)
print("A + B:")
for row in C:
    print(row)

# 矩阵乘法(需要调整 B 的形状)
B_T = transpose(B)
D = matrix_multiply(A, B_T)
print("\nA·Bᵀ:")
for row in D:
    print(row)

# 转置
A_T = transpose(A)
print("\nAᵀ:")
for row in A_T:
    print(row)

练习2:逆矩阵

计算矩阵的逆矩阵并验证

E = [[2, 1],
     [1, 1]]

E_inv = inverse_matrix(E)
print("E⁻¹:")
for row in E_inv:
    print(row)

print(f"\n验证: {is_inverse(E, E_inv)}")

练习3:矩阵的秩

计算下列矩阵的秩

F = [[1, 2, 3],
     [2, 4, 6],
     [3, 6, 9]]

rank_F = matrix_rank(F)
print(f"rank(F) = {rank_F}")  # 1

G = [[1, 0, 0],
     [0, 1, 0],
     [0, 0, 1]]

rank_G = matrix_rank(G)
print(f"rank(G) = {rank_G}")  # 3

章节小结

本章介绍了矩阵及其运算:

  1. 矩阵的定义:理解矩阵的概念和特殊矩阵
  2. 矩阵运算:掌握矩阵加法、数乘、乘法
  3. 逆矩阵:学会求逆矩阵,理解可逆的条件
  4. 矩阵的秩:理解秩的概念和性质
  5. 矩阵的应用:了解矩阵在线性变换、图像处理、网络分析中的应用

矩阵是线性代数的核心,是后续学习线性方程组和特征值理论的基础。

下一步

继续学习第三章:线性方程组,学习线性方程组的解法、解的结构等内容。


重点提醒: - 矩阵乘法不满足交换律 - 行列式为零的矩阵不可逆 - 矩阵的秩是衡量矩阵"退化"程度的重要指标 - 单位矩阵在矩阵运算中起着重要作用 - NumPy 提供了高效的矩阵运算函数