矩阵
一、数学中的矩阵
1、矩阵的基本定义和各种矩阵
- 矩阵(Matrix)是由数字、符号或表达式按行(Row)和列(Column) 排列成的矩形阵列。
- 矩阵一般由大写字母表示,例如A,B,M等
- 矩阵中的元素由用小写字母加行列下标表示,如
a ij 表示第 i 行第 j 列的元素。
- 行矩阵(Row Matrix):只有一行(如 1×n)。
- 列矩阵(Column Matrix):只有一列(如 n×1)
- 方阵(Square Matrix):行数等于列数(如 n×n)
- 单位矩阵:对角线上全是1,其余全是0,可写作I。
- 对角矩阵(Diagonal Matrix):非对角线元素全为 0。
- 对称矩阵(Symmetric Matrix):沿着左上到右下的对角线对折,两边元素相等。
- 正交矩阵(Orthogonal Matrix):A的转置×A=I(单位向量),A就是正交矩阵
2、矩阵的运算
矩阵加法、减法: A 和 B 必须都是 m × n 矩阵。
两个相同维度的矩阵 A和 B可以相加、相减,返回一个矩阵。
例如:C = A + B , 其中矩阵数乘(标量乘法):一个矩阵A乘以一个标量k,得到一个矩阵。
例如:B = kA , 其中矩阵乘法: 返回的是矩阵或标量
矩阵乘法C = A × B 的定义:
- 条件:
- A 是 m × n 矩阵, B 是 n × p 矩阵。
- 结果 C 是 m × p 矩阵。
- 不满足交换律(即,一般情况下 AB ≠ BA );满足结合律(矩阵顺序不变,仅计算顺序改变) 和 分配律。
- 条件:
矩阵转置(Transpose):将矩阵的行、列互换,返回一个矩阵。
3、矩阵的逆(Inverse):返回一个矩阵。
对于一个方阵 A,如果存在 A-1 使得:A* A-1 = I(单位矩阵),则 A-1是 A 的逆矩阵。
若 A* A-1 = A-1 * A = I (其中 I 是单位矩阵),则称 A 是可逆矩阵(Invertible Matrix)。
- 注意:
不是所有的矩阵都有逆矩阵,仅方阵可能有逆矩阵。
矩阵可逆的条件:行列式 det(A) ≠ 0(也就是满秩);且矩阵是方形矩阵。 - 矩阵的逆的性质
- A的逆的逆是A本身
- AB的逆 是B的逆乘A的逆
- A的逆的转置是A的转置的逆
4、矩阵的行列式 (返回一个标量)
- 对于一个 n阶方阵 A(即 n×n 的矩阵),其行列式记作 det(A) 或 ∣A∣,行列式是一个标量值。
- 行列式的计算
则n阶矩阵的行列式的计算公式为
- 行列式的性质:
- 单位矩阵的行列式为1
- 矩阵的行列式与其转置矩阵的行列式相同 :丨A丨 = 丨A.T丨
A@B
的行列式 = A的行列式*B的行列式 : 丨A@B丨 = 丨A丨丨B丨- A-1 的行列式 = 1/A的行列式 :丨A-1丨 = 丨1/A丨
- 行列式与初等行变换:
- 交换两行:行列式变号。
- 某行乘以标量 k:行列式乘以 k。
- 某行加上另一行的倍数:行列式不变。
二、numpy中的基础矩阵
1、创建矩阵(二维数组)
- 使用
np.matrix
- 使用
np.ndarray
转换 - 使用
zeros
、ones
、eye\identit
创建0矩阵、全是1的矩阵、单位矩阵
import numpy as np
# 从列表或嵌套列表创建
A = np.matrix([[1, 2], [3, 4]]) # 2x2 矩阵
B = np.matrix("1 2; 3 4") # 使用 MATLAB 风格字符串(分号分隔行)
arr = np.array([[1, 2], [3, 4]])
M = np.matrix(arr) # 将 ndarray 转为 matrix
# 输出:
# [[1, 2],
# [3, 4]]
print(np.eye(2))
# [[1. 0.]
# [0. 1.]]
print(np.ones((2,2)))
# [[1. 1.]
# [1. 1.]]
print(np.zeros((2,2)))
# [[0. 0.]
# [0. 0.]]
2、矩阵的运算
元素级运算 :
+, -, *, /, **
等操作符执行元素级运算(逐个元素进行运算)。A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) # 元素级加法 print(A + B) # [[6 8], [10 12]] # 元素级乘法 print(A * B) # [[5 12], [21 32]]
矩阵的转置:使用
.T
属性或np.transpose()
。(A+B)T = AT+BT逆矩阵:调用
np.linalg.inv()
( inv(ABC) = inv©@inv(B)@inv(A))矩阵的行列式:使用
np.linalg.det()
计算矩阵的行列式,得到一个标量。矩阵的迹(trace): 矩阵对角线元素的和,使用
np.trace
。对角矩阵:
np.diag()
获取对角线元素或者创建对角矩阵。
A = np.array([[1, 2], [3, 4]])
print(A.T) # 转置后:[[1 3], [2 4]]
print(np.linalg.inv(A)) # A的逆矩阵:[[-2. 1. ], [ 1.5 -0.5]]
print(np.linalg.det(A)) # 输出:-2.0000
- 矩阵乘法(
np.matmul
):A是m×n的矩阵,B是n×p的矩阵,C=AB是m×p的矩阵,其中每个元素的计算方式为:
计算示例:
矩阵乘法满足结合律((AB)C = A(BC))、分配律(A(B+C) = AB+AC),不满足交换律(AB≠BA)
np.matmul(A.T, A)
一定是对称矩阵
np.matmul(单位矩阵, 任何矩阵)
,np.matmul(任何矩阵, 单位矩阵)
的结果都是任何矩阵它自己
3、矩阵的四种看待方式
原始定义 : 结果矩阵的第 i 行第 j 列是左矩阵的第 i 行与右矩阵的第 j 列的点积。
外积:左矩阵列向量与右矩阵的行向量的外积之和。(适用于低秩分解(如SVD)、并行计算优化)
列向量的组合:右矩阵的每一列是左矩阵的列向量的线性组合。(适用于计算机图形学、线性变换可视化)。矩阵A对向量b进行线性变换。
- 行向量的组合:左矩阵的每一行是右矩阵的行向量的线性组合。(适用于优化问题、行空间分析)
4、矩阵的秩、空间和线性方程
线性相关性:
- 线性相关:两个向量A,B存在两个系数c1,c2(c1,c2不全为0),使得c1A + c2B = 0,则AB是线性相关的
- 线性无关:只有在c1c2全为0的时候,c1A + c2B 才等于0
矩阵的秩
numpy.linalg.matrix_rank
:矩阵的秩是其行(或列)向量中线性无关的最大数目,记为rank(A)- A和A.T的秩相等
- 秩 <= 最小维度,即
rank(A(m行n列)) <= min(m,n)
- 满秩矩阵:
rank(A(m行n列)) = min(m,n)
,则A为满秩矩阵(当且仅当A为方阵的时候,A为可逆矩阵) rank(AB) ≤ min(rank(A),rank(B))
:A@B的秩 小于等于 A的秩和B的秩之间的最小值rank(A + B) ≤ rank(A) + rank(B)
: A+B的秩 小于等于 A的秩 + B的秩- 秩的计算方法
- 线性无关的列数和行数
- 使用
numpy.linalg.matrix_rank
函数 - 使用消元法(通过初等行变换,)将矩阵化为行最简形阶梯形矩阵,从而数出非零行,即为秩,
import numpy as np
A = np.array([[2, 1, 3], [1, 2, 1], [3, 2, 2]])
rank = np.linalg.matrix_rank(A) # 输出: 3
- 矩阵的空间
空间类型 | 定义 | 维度公式 | 意义 |
---|---|---|---|
行空间(Row Space) | 行向量的线性组合 | rank(A) | 输入空间的有效维度 |
列空间(Column Space) | 列向量的线性组合 | rank(A) | 输出空间的像(Image) |
零空间(Null Space) | A x = 0 的解 | n - rank(A) | 解的冗余自由度 |
左零空间(Left Null Space) | yT A = 0 | n - rank(A) | 转置矩阵的零空间 |
线性方程
方程组 Ax = b 的解取决于秩的关系:情况 解的性质 条件 唯一解 存在且唯一 rank(A) = rank(A丨b) = n 无穷多解 解空间 = 特解 + 零空间基 rank(A) = rank(A丨b) < n 无解 方程组矛盾 rank(A) < rank(A丨b) - 求解方法:
- 当A矩阵有唯一解的时候:使用
np.linalg.solve(A, b)
(解N元一次方程组AX = b,如果方程组中有 没有意义 的方程组,那么程序就会报错;方程组中的所有方程都有用则解是唯一的),或者使用A-1 Ax = A-1b => x =np.linalg.inv(A) @ b
- 最小二乘解(无解时):
np.linalg.lstsq(A, b)
。 - 零空间基:
scipy.linalg.null_space(A)
。
- 当A矩阵有唯一解的时候:使用
- 求解方法: