《线性代数》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}\)

posted @ 2023-08-29 11:31  古明地盆  阅读(56)  评论(0编辑  收藏  举报