实验W5&6 – 矩阵
本文最后更新于21 天前,其中的信息可能已经过时,如有错误请留言

矩阵的定义:矩阵是由数字组成的、包含 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)和ap均常用于表示内积,本课程中会交替使用这两种符号。

\(\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视为从坐标原点出发的有向线段(箭头),则它们之间会形成一个夹角,记为θ。可以证明,内积与向量夹角满足以下关系:
uv=∥u∥2​∥v∥2​cos(θ)

练习:在二维平面R2中,画出从原点出发的向量u=(5,0)Tv=(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,此时它们的内积uv=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)

学习笔记如有侵权,请提醒我,我会马上删除
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇