线性代数(二)矩阵及其运算¶
章节概述¶
矩阵是线性代数的核心概念,是描述线性变换和线性方程组的重要工具。本章将介绍矩阵的定义、运算、逆矩阵、秩以及应用。
学习目标¶
- 理解矩阵的定义和表示
- 掌握矩阵的基本运算
- 学会求逆矩阵
- 理解矩阵的秩的概念
- 了解矩阵的应用
(一)矩阵的定义¶
矩阵的定义¶
m×n 矩阵是由 m 行 n 列的数排成的矩形数组:
特殊矩阵¶
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. 矩阵加法¶
两个同型矩阵相加,对应元素相加:
2. 矩阵数乘¶
矩阵与数相乘,每个元素都乘以该数:
3. 矩阵乘法¶
m×n 矩阵 A 与 n×p 矩阵 B 相乘,得到 m×p 矩阵 C:
注意:矩阵乘法不满足交换律,即 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,使得:
则称 B 为 A 的逆矩阵,记作 A⁻¹逆矩阵存在的条件¶
定理:方阵 A 可逆的充分必要条件是 det(A) ≠ 0
逆矩阵的计算¶
伴随矩阵法:
其中 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. 线性变换¶
矩阵可以表示线性变换。例如,旋转矩阵:
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
章节小结¶
本章介绍了矩阵及其运算:
- 矩阵的定义:理解矩阵的概念和特殊矩阵
- 矩阵运算:掌握矩阵加法、数乘、乘法
- 逆矩阵:学会求逆矩阵,理解可逆的条件
- 矩阵的秩:理解秩的概念和性质
- 矩阵的应用:了解矩阵在线性变换、图像处理、网络分析中的应用
矩阵是线性代数的核心,是后续学习线性方程组和特征值理论的基础。
下一步¶
继续学习第三章:线性方程组,学习线性方程组的解法、解的结构等内容。
重点提醒: - 矩阵乘法不满足交换律 - 行列式为零的矩阵不可逆 - 矩阵的秩是衡量矩阵"退化"程度的重要指标 - 单位矩阵在矩阵运算中起着重要作用 - NumPy 提供了高效的矩阵运算函数