《线性代数》4. 矩阵的高级话题

作者:@古明地盆
喜欢这篇文章的话,就点个关注吧,或者关注一下我的公众号也可以,会持续分享高质量Python文章,以及其它相关内容。:点击查看公众号


更多的变换矩阵

之前我们说矩阵可以看作是向量的函数,矩阵可以改变一个点的坐标,比如将一个点的横坐标扩大 a 倍,纵坐标扩大 b 倍,那么就可以让如下矩阵与之相乘。

T={a00b}

本次就来介绍更多的变换矩阵,假设我们希望一个点沿着 x 轴翻转,也就是让坐标 (x,y) 变成 (x,y),那么变换矩阵 T 是多少呢?很明显,此时相当于将横坐标扩大为原来的 1 倍(不变),纵坐标扩大为原来的 1 倍,所以 T 如下。

T={1001}

如果希望一个点沿着 y 轴翻转,也就是让坐标 (x,y) 变成 (x,y),那么变换矩阵 T 的值就是下面这样。

T={1001}

如果希望一个点沿着原点翻转,也就是让坐标 (x,y) 变成 (x,y),那么变换矩阵 T 的值就是下面这样。

T={1001}

如果希望一个点沿着 x 轴错切,也就是让坐标 (x,y) 变成 (x+ay,y),那么变换矩阵 T 的值就是下面这样。

T={1a01}

如果希望一个点沿着 x 轴错切,也就是让坐标 (x,y) 变成 (x,y+bx),那么变换矩阵 T 的值就是下面这样。

T={10b1}

矩阵的旋转变换

假设有一个点 (x,y),然后 (x,y)=T·(x,y),如果我们希望 (x,y) 相对于 (x,y) 是顺时针旋转 θ 度,那么 T 是多少呢?首先要想求 T,我们首先要知道 (x,y) 旋转 θ 度之后的 (x,y) 是多少。

我们对式子化简,可以得出:

  • x=cos(αθ)cosαx=cosαcosθ+sinαsinθcosαx=cosθ·x+sinθsinαcosα·x=cosθ·x+sinθtanα·x=cosθ·x+sinθ·y
  • y=sin(αθ)sinαy=sinαcosθcosαsinθsinαy=cosθ·ysinθcosαsinαy=cosθ·ysinθcotα·y=cosθ·ysinθ·x

所以 (x,y) 顺时针旋转 θ 度之后,坐标点会变成 (cosθ·x+sinθ·y,cosθ·ysinθ·x),那么现在的问题就变成了如果想让矩阵 T(x,y) 相乘之后,变成 (cosθ·x+sinθ·y,cosθ·ysinθ·x),那么 T 是多少?

首先 T 肯定是一个 2×2 的矩阵,我们计算一下就知道了。

{abcd}·(xy)={ax+bycx+dy}=(cosθ·x+sinθ·ycosθ·ysinθ·x)

所以很明显:a=cosθ,b=sinθ,c=sinθ,d=cosθ,矩阵 T 就是:

T={cosθsinθsinθcosθ}

以后让 T 乘上某个向量,就可以让它顺时针旋转 θ 度,这个 θ 是一个已知值。

单位矩阵

在介绍向量的时候,我们说模为 1 向量叫做单位向量,比如半径为 1 的圆,那么圆上任意一点都是单位向量。同理也有单位矩阵,那么单位矩阵是怎么定义的呢?很简单,如果矩阵 I 和向量 v 相乘之后,或者说对 v 进行映射之后,得到的结果还是 v,那么我们就称矩阵 I 是单位矩阵。

而单位矩阵有两个特点:

  • 它是一个方阵
  • 主对角线的元素都是 1,其它元素是 0

In={100···0010···0001···0···············000···1}

那么单位矩阵都有哪些性质呢?

  • I·A=A
  • A·I=A

矩阵的逆

在数字系统中,如果存在一个非零整数 y,使得 x·y=y·x=1,那么 y 就叫 x 的倒数,记作 y=x1

同理在矩阵中也是如此,如果 AB=BA=I,则称 BA 的逆矩阵,记作 B=A1。也就说,两个矩阵相乘(无论是 A·B 还是 B·A)如果等于单位矩阵 I,那么其中一个矩阵就是另一个矩阵的逆矩阵。需要注意的是,不是所有矩阵都有逆矩阵,如果一个矩阵没有逆矩阵,那么该矩阵就是不可逆矩阵,或者叫奇异矩阵(non-singular)。反之就是可逆矩阵,或者非奇异矩阵。

值得一提的是,矩阵的乘法不满足交换律,有可能 AB=I,但是 BAI,那么此时我们称 BA 的右逆矩阵。如果 BA=I,但是 ABI,那么我们称 BA 的左逆矩阵。

当然,在 BA 的左逆矩阵的同时,A 也是 B 的右逆矩阵,反之依然。

因为有的矩阵可能只有左逆矩阵,或者只有右逆矩阵,如果左逆矩阵和右逆矩阵同时存在,那么它们一定是相等的。换言之,如果矩阵 A 既存在左逆矩阵 B 又存在右逆矩阵 C,那么 BC 一定是相等的,并且是 A 的逆矩阵。

咋一看这个结论不好理解,但证明起来很简单,证明:如果 AB=I,CA=I,那么 BC 相等。

因为矩阵乘以单位矩阵还等于原矩阵,所以 C(AB)=CI,矩阵乘法虽然没有交换律,但满足结合律,所以可以得出 (CA)B=C,进而得出 B=C

在线性代数中,我们只关心逆矩阵,至于是左逆还是右逆则不太关心。

然后可逆矩阵要满足 AB=BA=I,那么可逆矩阵一定是方阵,如果不是方阵,那么该矩阵就是不可逆矩阵(奇异矩阵)。

  • 补充:一个整数的 0 次幂等于 1,那么一个矩阵的 0 次幂等于多少呢?显然是单位矩阵。
  • A1 就是 A 的逆矩阵,而 An 就是 (A1)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 存在两个不同的逆矩阵 BC,那么:

AB=AC=I

B(AB)=B(AC)

(BA)B=(BA)C

B=C

但是推出来,BC 是相等的,所以一个矩阵如果可逆,那么它的逆矩阵一定是唯一的。

性质:(A1)1=A,一个矩阵的逆矩阵的逆矩阵,还等于它自身。

证明:首先 A 的逆矩阵是 B,那么意味着 B 的逆矩阵是 A。我们记 B=A1,那么 B1=(A1)1,显然等于 A

性质:(A·B)1=B1A1

证明:显然 (AA1)·(BB1)=I,进而得出 (AB)·(A1B1)=I,又因为 (AB)·(AB)1=I,所以 (A·B)1=B1A1。该性质和上面那个性质,和矩阵的转置比较像。

不过既然提到了转置,那么再补充一个,(AT)1=(A1)T,它的证明也很简单。

基于 IT=I 可以得出 (A1·A)T=I,因为 (A·B)T=BT·AT,所以 (A1·A)T=I=AT·(A1)T

(AT)1·AT=I,所以 (AT)1·AT=AT·(A1)T,进而得出 (AT)1=(A1)T

posted @   古明地盆  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
历史上的今天:
2020-08-29 《深度剖析CPython解释器》17. Python类机制的深度解析(第一部分): 回顾Python中的对象模型
2020-08-29 《深度剖析CPython解释器》16. Python函数机制的深度解析(第三部分): 闭包的底层实现以及调用
点击右上角即可分享
微信分享提示

目录导航