矩阵的定义:矩阵是由数字组成的、包含 n 行 m 列并置于括号内的表格
用 numpy 表示矩阵
import numpy as np
B = np.array([[3, 1, -6.2], [2, -5, np.pi]])
N = np.array([[-4, 9], [7/8, 6], [0, 0]])
Z = np.array([[1, 2, 0], [1, -2, 1], [0, 1, -4]])
print('B = \n', B)
print('N = \n', N)
print('Z = \n', Z)
//运行结果
B =
[[ 3. 1. -6.2 ]
[ 2. -5. 3.14159265]]
N =
[[-4. 9. ]
[ 0.875 6. ]
[ 0. 0. ]]
Z =
[[ 1 2 0]
[ 1 -2 1]
[ 0 1 -4]]
在 numpy 中,求矩阵的转置只需在矩阵变量后加.T
print('B.T = \n', B.T)
print('N.T = \n', N.T)
print('Z.T = \n', Z.T)
矩阵的加法与减法
只有维度(或形状)相同的矩阵才能进行加法或减法运算
print('B - N.T = \n', B - N.T)
Y = Z + Z.T
print('Y = \n', Y)
symmetric matrix
具有Y=YT这种性质的矩阵称为 “对称矩阵”(symmetric matrix),其特点是关于主对角线(从左上角到右下角的对角线)对称。
我们还可以从数学上证明:
YT=(Z+ZT)T=ZT+(ZT)T=ZT+Z=Y
因此,任意方阵与其自身的转置矩阵相加,结果一定是对称矩阵
对称矩阵一定是方阵
非方阵与其自身的转置矩阵能相加吗?不能,矩阵相加的前提是两个矩阵的行数和列数都相同
Matrix Multiplication by a Scalar
矩阵可与标量(单个数字)相乘,运算规则为:将矩阵的每个元素都乘以该标量。
在 numpy 中实现该运算的代码如下:
C = 2 * B
print('C = \n', C)
The vector dot, scalar or inner product
点积、标量积或内积
向量内积运算规律为:将两个向量对应位置的元素相乘,再将所有乘积相加。
只有当两个向量的维度相同时,它们的内积才存在
PS:符号(a,p)和a⋅p均常用于表示内积,本课程中会交替使用这两种符号。
\(\boxed{u \cdot u}\)与\(\boxed{\| u \|_2^2}\)(向量\(\boxed{u}\)的 2 – 范数的平方)有什么关系?
二者相等。
向量u的 2 – 范数(欧几里得范数)定义为:
\(\| u \|_2 = \sqrt{u_1^2 + u_2^2 + \dots + u_n^2}\)
因此其平方为:
\(\| u \|_2^2 = u_1^2 + u_2^2 + \dots + u_n^2 = u \cdot u\)
若将两个向量u,v∈Rn视为从坐标原点出发的有向线段(箭头),则它们之间会形成一个夹角,记为θ。可以证明,内积与向量夹角满足以下关系:
u⋅v=∥u∥2∥v∥2cos(θ)
练习:在二维平面R2中,画出从原点出发的向量u=(5,0)T和v=(2,2)T,计算它们之间的夹角,并验证上述内积公式
u = np.array([5, 0])
v = np.array([2, 2])
# 计算夹角的余弦值
cos_theta = u.dot(v) / (np.linalg.norm(u) * np.linalg.norm(v))
#默认是norm(u, ord=2) # u 的 2-范数(默认,可省略 ord=2)
# 由余弦值求夹角(弧度制)
theta_rad = np.arccos(cos_theta)
# 转换为角度制
theta_deg = 180 * theta_rad / np.pi
print('夹角θ = ', theta_rad, '弧度')
print('夹角θ = ', theta_deg, '度')
若两个向量相互垂直(夹角为 90°),则cosθ=0,此时它们的内积u⋅v=0,这样的向量称为 “正交向量”(orthogonal vectors)。
若两个向量不仅正交,且各自的 2 – 范数(欧几里得范数)均为 1(即∥u∥2=∥v∥2=1),则它们被称为 “标准正交向量”(orthonormal vectors)。
矩阵乘法 Matrix Multiplication
当两个矩阵的形状满足 “兼容性” 时,它们可以相乘。矩阵乘法的运算规律与向量内积(标量积 / 点积)一致:沿着左侧矩阵的行方向,同时沿着右侧矩阵的列方向,对应元素相乘后求和。
只有当左侧矩阵的列数等于右侧矩阵的行数时,两个矩阵才能相乘(此时称它们 “形状兼容”)。若不满足该条件,则矩阵乘积不存在。

J = np.array([[3, 4], [2, 1]])
L = np.array([[1, 5, -7], [-3, -4, 0]])
# 方法1:使用数组的dot()方法
print('JL = \n', J.dot(L))
# 方法2:使用numpy的dot()函数
print('JL = \n', np.dot(J, L))
*运算符实现的是 “元素级乘法”(element-wise multiplication):将两个矩阵对应位置的元素直接相乘,而非矩阵乘法
K = np.array([[1, 5], [-3, -4]])
print('JK(矩阵乘法) = \n', J.dot(K))
JK(矩阵乘法) =
[[-9 -1]
[-1 6]]
print('JK(*运算符) = \n', J * K)
JK(*运算符) =
[[ 3 20]
[-6 -4]]
矩阵的下标表示法
为了通用地表示向量或矩阵中的元素,我们引入 “下标”(subscript)符号。
- 对于 n 维向量v∈Rn,其第 j 个位置的元素记为vj;
- 对于 m×n 矩阵R∈Rm×n,其第 i 行第 j 列的元素记为rij(若可能产生歧义,也可记为ri,j)。
重要注意事项:在 numpy 中,数组的下标从 0 开始(而非数学中的从 1 开始)。因此,数学中的N1,2(第 1 行第 2 列)在 numpy 代码中需表示为N[0,1],这一点容易混淆,需特别注意!
The Matrix-Vector Product
列向量可视为只有 1 列的矩阵,因此,只要矩阵与向量的形状兼容(矩阵的列数等于向量的维度),就可以进行乘法运算。其中,形如Bu=f的矩阵 – 向量乘法应用尤为广泛。
B = np.array([[3, -2, 4], [-6, 6, -11], [6, 2, 5]])
# 注意:numpy中列向量需表示为(3,1)形状的二维数组(而非(3,)形状的一维数组)
u = np.array([[2], [0], [-1]])
f = B.dot(u)
print('f = \n', f)
#输出:
f =
[[ 2]
[-1]
[ 7]]
The Matrix Inverse and Determinant of a Square Matrix
上述例子表明:若B−1B=I,则B−1称为矩阵 B 的 “逆矩阵”(inverse matrix)
若行列式值为 0,则逆矩阵不存在
行列式是一个定义在方阵上的特殊标量,计算复杂且规则繁琐。对于方阵 K,其行列式记为det(K)。
逆矩阵存在定理:一个方阵K可逆(即逆矩阵\(K^{-1}\)存在)的充分必要条件是其行列式不为0(\(\det(K) \neq 0\))。若K可逆,则满足\(K^{-1}K = KK^{-1} = I\)(单位矩阵)。
对于$2×2$矩阵,行列式和逆矩阵的计算规则相对简单: 若方阵$K = \begin{pmatrix} a & b \\ c & d \end{pmatrix}$,则: 1. 行列式:$\det(K) = ad – bc$(主对角线元素乘积减去副对角线元素乘积)。 2. 逆矩阵:当且仅当$\det(K) \neq 0$时,$K$的逆矩阵存在,且 $K^{-1} = \frac{1}{\det(K)} × \begin{pmatrix} d & -b \\ -c & a \end{pmatrix}$。 我们可通过矩阵乘法验证逆矩阵的正确性: $K^{-1}K = \frac{1}{\det(K)} × \begin{pmatrix} d & -b \\ -c & a \end{pmatrix} × \begin{pmatrix} a & b \\ c & d \end{pmatrix} = \frac{1}{ad-bc} × \begin{pmatrix} ad – bc & 0 \\ 0 & ad – bc \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} = I$
对于 3×3 及更高维度的方阵,行列式的计算需使用 “展开式” 或 “按行 / 列展开” 等复杂规则(如余子式、代数余子式等),逆矩阵的计算则更为繁琐(如伴随矩阵法)。
of a Square MatrixDeterminant of a Square Matrixt of a Square M
# 定义矩阵B(前文例子中的3×3矩阵)
B = np.array([[3, -2, 4], [-6, 6, -11], [6, 2, 5]])
# 计算B的行列式
det_B = np.linalg.det(B)
print('det(B) = ', det_B)
# 计算B的逆矩阵
inv_B = np.linalg.inv(B)
# 为了使输出结果更清晰(与前文理论形式一致),将逆矩阵乘以36
inv_36B = 36 * inv_B
print('36 × B的逆矩阵 = \n', inv_36B)
#输出:
36 × B的逆矩阵 =
[[ 52. 18. -2.]
[-36. -9. 9.]
[-48. -18. 6.]]
# 验证 B × B^{-1} = I BB_inv = B.dot(inv_B) print(‘B × B的逆矩阵 = \n’, BB_inv) # 验证 B^{-1} × B = I inv_BB = inv_B.dot(B) print(‘B的逆矩阵 × B = \n’, inv_BB)









