《线性代数》4. 矩阵的高级话题
更多的变换矩阵
之前我们说矩阵可以看作是向量的函数,矩阵可以改变一个点的坐标,比如将一个点的横坐标扩大 a 倍,纵坐标扩大 b 倍,那么就可以让如下矩阵与之相乘。
\(T = \begin{Bmatrix}a & 0\\0 & b\end{Bmatrix}\)
本次就来介绍更多的变换矩阵,假设我们希望一个点沿着 \(x\) 轴翻转,也就是让坐标 \((x, y)\) 变成 \((x, -y)\),那么变换矩阵 \(T\) 是多少呢?很明显,此时相当于将横坐标扩大为原来的 \(1\) 倍(不变),纵坐标扩大为原来的 \(-1\) 倍,所以 \(T\) 如下。
\(T = \begin{Bmatrix}1 & 0\\0 & -1\end{Bmatrix}\)
如果希望一个点沿着 \(y\) 轴翻转,也就是让坐标 \((x, y)\) 变成 \((-x, y)\),那么变换矩阵 \(T\) 的值就是下面这样。
\(T = \begin{Bmatrix}-1 & 0\\0 & 1\end{Bmatrix}\)
如果希望一个点沿着原点翻转,也就是让坐标 \((x, y)\) 变成 \((-x, -y)\),那么变换矩阵 \(T\) 的值就是下面这样。
\(T = \begin{Bmatrix}-1 & 0\\0 & -1\end{Bmatrix}\)
如果希望一个点沿着 \(x\) 轴错切,也就是让坐标 \((x, y)\) 变成 \((x + ay, y)\),那么变换矩阵 \(T\) 的值就是下面这样。
\(T = \begin{Bmatrix}1 & a\\0 & 1\end{Bmatrix}\)
如果希望一个点沿着 \(x\) 轴错切,也就是让坐标 \((x, y)\) 变成 \((x, y + bx)\),那么变换矩阵 \(T\) 的值就是下面这样。
\(T = \begin{Bmatrix}1 & 0\\b & 1\end{Bmatrix}\)
矩阵的旋转变换
假设有一个点 \((x, y)\),然后 \((x', y') = T · (x, y)\),如果我们希望 \((x', y')\) 相对于 \((x, y)\) 是顺时针旋转 \(θ\) 度,那么 \(T\) 是多少呢?首先要想求 \(T\),我们首先要知道 \((x, y)\) 旋转 \(θ\) 度之后的 \((x', y')\) 是多少。
我们对式子化简,可以得出:
- \(x' = \frac{cos(α - θ)}{cosα}x = \frac{cosαcosθ + sinαsinθ}{cosα}x = cosθ · x + sinθ\frac{sinα}{cosα}·x = cosθ · x + sinθtanα·x = cosθ·x + sinθ·y\)
- \(y' = \frac{sin(α - θ)}{sinα}y = \frac{sinαcosθ - cosαsinθ}{sinα}y = cosθ · y - sinθ\frac{cosα}{sinα}y = cosθ · y - sinθcotα·y = cosθ·y - sinθ·x\)
所以 \((x, y)\) 顺时针旋转 \(θ\) 度之后,坐标点会变成 \((cosθ·x + sinθ·y, cosθ·y - sinθ·x)\),那么现在的问题就变成了如果想让矩阵 \(T\) 和 \((x, y)\) 相乘之后,变成 \((cosθ·x + sinθ·y, cosθ·y - sinθ·x)\),那么 \(T\) 是多少?
首先 \(T\) 肯定是一个 \(2×2\) 的矩阵,我们计算一下就知道了。
\(\begin{Bmatrix}a & b\\c & d \end{Bmatrix} · \begin{pmatrix}x\\y\end{pmatrix} = \begin{Bmatrix}ax + by\\cx + dy\end{Bmatrix} = \begin{pmatrix}cosθ·x + sinθ·y\\cosθ·y - sinθ·x\end{pmatrix}\)
所以很明显:\(a = cosθ, b = sinθ, c = -sinθ, d = cosθ\),矩阵 \(T\) 就是:
\(T = \begin{Bmatrix}cosθ & sinθ\\-sinθ & cosθ\end{Bmatrix}\)
以后让 \(T\) 乘上某个向量,就可以让它顺时针旋转 \(θ\) 度,这个 \(θ\) 是一个已知值。
单位矩阵
在介绍向量的时候,我们说模为 1 向量叫做单位向量,比如半径为 1 的圆,那么圆上任意一点都是单位向量。同理也有单位矩阵,那么单位矩阵是怎么定义的呢?很简单,如果矩阵 \(I\) 和向量 \(v\) 相乘之后,或者说对 \(v\) 进行映射之后,得到的结果还是 \(v\),那么我们就称矩阵 \(I\) 是单位矩阵。
而单位矩阵有两个特点:
它是一个方阵
主对角线的元素都是 1,其它元素是 0
\(I_{n} = \begin{Bmatrix}1 & 0 & 0 & ··· & 0\\0 & 1 & 0 & ··· & 0\\0 & 0 & 1 & ··· & 0\\··· & ··· & ··· & ··· & ···\\0 & 0 & 0 & ··· & 1\end{Bmatrix}\)
那么单位矩阵都有哪些性质呢?
- \(I·A = A\)
- \(A · I = A\)
矩阵的逆
在数字系统中,如果存在一个非零整数 \(y\),使得 \(x · y = y · x = 1\),那么 \(y\) 就叫 \(x\) 的倒数,记作 \(y = x^{-1}\)。
同理在矩阵中也是如此,如果 \(AB = BA = I\),则称 \(B\) 是 \(A\) 的逆矩阵,记作 \(B = A^{-1}\)。也就说,两个矩阵相乘(无论是 \(A·B\) 还是 \(B·A\))如果等于单位矩阵 \(I\),那么其中一个矩阵就是另一个矩阵的逆矩阵。需要注意的是,不是所有矩阵都有逆矩阵,如果一个矩阵没有逆矩阵,那么该矩阵就是不可逆矩阵,或者叫奇异矩阵(non-singular)。反之就是可逆矩阵,或者非奇异矩阵。
值得一提的是,矩阵的乘法不满足交换律,有可能 \(AB=I\),但是 \(BA≠I\),那么此时我们称 \(B\) 是 \(A\) 的右逆矩阵。如果 \(BA = I\),但是 \(AB≠I\),那么我们称 \(B\) 是 \(A\) 的左逆矩阵。
当然,在 \(B\) 是 \(A\) 的左逆矩阵的同时,\(A\) 也是 \(B\) 的右逆矩阵,反之依然。
因为有的矩阵可能只有左逆矩阵,或者只有右逆矩阵,如果左逆矩阵和右逆矩阵同时存在,那么它们一定是相等的。换言之,如果矩阵 \(A\) 既存在左逆矩阵 \(B\) 又存在右逆矩阵 \(C\),那么 \(B\) 和 \(C\) 一定是相等的,并且是 \(A\) 的逆矩阵。
咋一看这个结论不好理解,但证明起来很简单,证明:如果 \(AB = I, CA = I\),那么 \(B\) 和 \(C\) 相等。
因为矩阵乘以单位矩阵还等于原矩阵,所以 \(C(AB) = CI\),矩阵乘法虽然没有交换律,但满足结合律,所以可以得出 \((CA)B=C\),进而得出 \(B = C\)。
在线性代数中,我们只关心逆矩阵,至于是左逆还是右逆则不太关心。
然后可逆矩阵要满足 \(AB = BA = I\),那么可逆矩阵一定是方阵,如果不是方阵,那么该矩阵就是不可逆矩阵(奇异矩阵)。
- 补充:一个整数的 \(0\) 次幂等于 \(1\),那么一个矩阵的 \(0\) 次幂等于多少呢?显然是单位矩阵。
- \(A^{-1}\) 就是 \(A\) 的逆矩阵,而 \(A^{-n}\) 就是 \((A^{-1})^{n}\)。
再来看看如何用 Numpy 生成单位矩阵和逆矩阵。
import numpy as np
# 生成单位矩阵
print(np.eye(5))
"""
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
"""
print(np.eye(5, k=1))
"""
[[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]]
"""
print(np.eye(5, k=2))
"""
[[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
"""
print(np.eye(5, k=-2))
"""
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]]
"""
单位矩阵比较简单,就是主对角线上的值都为 1,然后 np.eye 还支持一个参数 k,含义就是代码演示的那样。
import numpy as np
# 2 x 2 的矩阵
m = np.array(
[[1, 2], [3, 4]]
)
# 获取逆矩阵
m_inv = np.linalg.inv(m)
print(m_inv)
"""
[[-2. 1. ]
[ 1.5 -0.5]]
"""
# 矩阵乘上逆矩阵,结果是单位矩阵
print(m @ m_inv)
"""
[[1.0000000e+00 0.0000000e+00]
[8.8817842e-16 1.0000000e+00]]
"""
print(m_inv @ m)
"""
[[1.00000000e+00 0.00000000e+00]
[2.22044605e-16 1.00000000e+00]]
"""
# 注:浮点数存在误差
try:
np.linalg.inv(
np.array([[1, 2, 3], [2, 3, 4]])
)
except Exception as e:
# 计算矩阵的逆,那么该矩阵必须是方阵
print(e)
"""
Last 2 dimensions of the array must be square
"""
try:
np.linalg.inv(
np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
)
except Exception as e:
# 该矩阵为奇异矩阵,不存在逆矩阵
print(e)
"""
Singular matrix
"""
以上我们就通过编程实现了单位矩阵和逆矩阵,首先和单位矩阵一样,可逆矩阵也必须是方阵。但如果一个矩阵已经是方阵了,我们要如何判断它是否可逆呢?换句话说,什么的方阵才可逆呢?我们一会再说。
矩阵的逆的性质
介绍完矩阵的逆,再来说说它的性质。
性质:如果矩阵 \(A\) 存在逆矩阵 \(B\),则 \(B\) 唯一。
下面我们来证明这一点,假设矩阵 \(A\) 存在两个不同的逆矩阵 \(B\) 和 \(C\),那么:
\(AB = AC = I\)
\(B(AB) = B(AC)\)
\((BA)B = (BA)C\)
\(B = C\)
但是推出来,\(B\) 和 \(C\) 是相等的,所以一个矩阵如果可逆,那么它的逆矩阵一定是唯一的。
性质:\((A^{-1})^{-1} = A\),一个矩阵的逆矩阵的逆矩阵,还等于它自身。
证明:首先 \(A\) 的逆矩阵是 \(B\),那么意味着 \(B\) 的逆矩阵是 \(A\)。我们记 \(B = A^{-1}\),那么 \(B^{-1} = (A^{-1})^{-1}\),显然等于 \(A\)。
性质:\((A·B)^{-1} = B^{-1}A^{-1}\)
证明:显然 \((AA^{-1})·(BB^{-1})=I\),进而得出 \((AB)·(A^{-1}B^{-1})=I\),又因为 \((AB)·(AB)^{-1} = I\),所以 \((A·B)^{-1} = B^{-1}A^{-1}\)。该性质和上面那个性质,和矩阵的转置比较像。
不过既然提到了转置,那么再补充一个,\((A^{T})^{-1} = (A^{-1})^{T}\),它的证明也很简单。
基于 \(I^{T} = I\) 可以得出 \((A^{-1}·A)^{T} = I\),因为 \((A·B)^{T} = B^{T} · A^{T}\),所以 \((A^{-1}·A)^{T} = I = A^{T}·(A^{-1})^{T}\)。
而 \((A^{T})^{-1} · A^{T} = I\),所以 \((A^{T})^{-1} · A^{T} = A^{T}·(A^{-1})^{T}\),进而得出 \((A^{T})^{-1} = (A^{-1})^{T}\)。
如果觉得文章对您有所帮助,可以请囊中羞涩的作者喝杯柠檬水,万分感谢,愿每一个来到这里的人都生活愉快,幸福美满。
微信赞赏
支付宝赞赏