文章目录
-
- 问题1
- 一、先回到我们已经理解的二维直线
- 二、为什么说直线向量是一种"函数"?
- 三、为什么普通向量与协向量的变换方式不同?
-
- [3.1 把整个平面水平拉伸2倍](#3.1 把整个平面水平拉伸2倍)
- 四、逆矩阵究竟从哪里来?
- 五、为什么刚才的例子符合逆转置公式?
- 六、再解释一下:协向量与普通向量到底是什么关系?
- 七、最后联系你之前学习的齐次坐标
- 八、我希望你真正理解的一个区别
- 问题2
- 一、为什么三维法向量也需要使用逆转置矩阵?
-
- [1.1 三维法向量是什么?](#1.1 三维法向量是什么?)
- [1.2 为什么不能直接用普通矩阵变换法向量?](#1.2 为什么不能直接用普通矩阵变换法向量?)
- [1.3 那么逆转置是怎样推导出来的?](#1.3 那么逆转置是怎样推导出来的?)
- 二、为什么纯旋转时,法向量又可以直接乘旋转矩阵?
- [三、古典伴随矩阵(Adjugate Matrix)是什么?](#三、古典伴随矩阵(Adjugate Matrix)是什么?)
-
- [3.1 从一个普通的2×2矩阵开始](#3.1 从一个普通的2×2矩阵开始)
- [3.2 为什么古典伴随矩阵要这样构造?](#3.2 为什么古典伴随矩阵要这样构造?)
- 四、古典伴随矩阵和逆转置矩阵到底有什么关系?
-
- [4.1 为什么在射影几何中,可以忽略这个比例系数?](#4.1 为什么在射影几何中,可以忽略这个比例系数?)
- 五、为什么二维直线、三维法向量和古典伴随矩阵会同时出现?
- 六、最后再补充一个容易混淆的地方:为什么法向量还可以通过叉乘得到?
- 七、把这些知识放在一起理解
问题1
第9.5节的协向量(Co-vector)。
这里最容易让人困惑的是:
- 为什么 ( a , b , c ) (a,b,c) (a,b,c) 可以看作协向量,而不仅仅是一个普通向量?
- 为什么说协向量是一种"作用于向量的线性函数"?
- 为什么普通向量和协向量采用不同的变换规则?
- 逆转置矩阵到底是怎么出现的?
我重新从最基础的二维直线开始解释,不预先使用协向量这个概念。
一、先回到我们已经理解的二维直线
假设二维平面上有一条直线:
2 x + 3 y − 6 = 0 2x+3y-6=0 2x+3y−6=0
我们可以把它写成:
2 3 − 6 x y 1 = 0 \begin{bmatrix} 2&3&-6 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix}=0 23−6 xy1 =0
记作:
l ~ T x ~ = 0 \boxed{\tilde{\mathbf l}^T\tilde{\mathbf x}=0} l~Tx~=0
其中:
l ~ = 2 3 − 6 \tilde{\mathbf l}= \begin{bmatrix} 2\\3\\-6 \end{bmatrix} l~= 23−6
x ~ = x y 1 \tilde{\mathbf x}= \begin{bmatrix} x\\y\\1 \end{bmatrix} x~= xy1
到这里应该都没有问题。
但请注意:虽然这两个东西都是三个数字组成的列向量,它们的几何意义却完全不同。
x ~ \tilde{\mathbf x} x~ 描述的是一个点。
而 l ~ \tilde{\mathbf l} l~ 描述的是一条直线。
我们不妨先把它们看作两种不同类型的对象。
二、为什么说直线向量是一种"函数"?
我们先不考虑矩阵。
假设有一个函数:
f ( x , y ) = 2 x + 3 y − 6 f(x,y)=2x+3y-6 f(x,y)=2x+3y−6
给这个函数输入任意一个二维点,它就会输出一个数字。
例如:
输入:
( x , y ) = ( 0 , 0 ) (x,y)=(0,0) (x,y)=(0,0)
得到:
f ( 0 , 0 ) = − 6 f(0,0)=-6 f(0,0)=−6
输入:
( x , y ) = ( 3 , 0 ) (x,y)=(3,0) (x,y)=(3,0)
得到:
f ( 3 , 0 ) = 0 f(3,0)=0 f(3,0)=0
输入:
( x , y ) = ( 0 , 2 ) (x,y)=(0,2) (x,y)=(0,2)
得到:
f ( 0 , 2 ) = 0 f(0,2)=0 f(0,2)=0
你会发现:
这个函数输出为0的所有点,恰好构成一条直线。
也就是:
2 x + 3 y − 6 = 0 2x+3y-6=0 2x+3y−6=0
现在,我们把它写成齐次坐标形式:
f ( x ~ ) = 2 3 − 6 x ~ f(\tilde{\mathbf x})= \begin{bmatrix} 2&3&-6 \end{bmatrix} \tilde{\mathbf x} f(x~)=23−6x~
即:
f ( x ~ ) = l ~ T x ~ \boxed{f(\tilde{\mathbf x})=\tilde{\mathbf l}^T\tilde{\mathbf x}} f(x~)=l~Tx~
这时候,我们就可以换一种视角理解 l ~ \tilde{\mathbf l} l~:
它不仅仅是三个系数,还可以被理解成一个规则:
输入一个齐次坐标向量,计算它与 l ~ \tilde{\mathbf l} l~ 的点积,然后输出一个数。
例如:
l ~ = 2 3 − 6 \tilde{\mathbf l}= \begin{bmatrix} 2\\3\\-6 \end{bmatrix} l~= 23−6
就对应一个函数:
f ( X , Y , W ) = 2 X + 3 Y − 6 W f(X,Y,W)=2X+3Y-6W f(X,Y,W)=2X+3Y−6W
这个函数对齐次坐标向量是线性的,因为:
f ( α u + β v ) = α f ( u ) + β f ( v ) f(\alpha\mathbf u+\beta\mathbf v)= \alpha f(\mathbf u)+\beta f(\mathbf v) f(αu+βv)=αf(u)+βf(v)
这种把向量映射成标量的线性函数,就叫作线性泛函(Linear functional)。
协向量可以理解为线性泛函在某组基下的系数表示。
所以:
协向量可以看作一个作用于向量并输出标量的线性规则 \boxed{\text{协向量可以看作一个作用于向量并输出标量的线性规则}} 协向量可以看作一个作用于向量并输出标量的线性规则
这里有个容易忽略的细节: 2 x + 3 y − 6 2x+3y-6 2x+3y−6 作为普通二维坐标 ( x , y ) (x,y) (x,y) 的函数是仿射函数,而不是线性函数。但将输入扩展为齐次坐标 ( X , Y , W ) (X,Y,W) (X,Y,W) 后, 2 X + 3 Y − 6 W 2X+3Y-6W 2X+3Y−6W 就是线性函数。
三、为什么普通向量与协向量的变换方式不同?
这是最核心的一步。
假设我们有一个普通二维向量:
x = x y \mathbf x= \begin{bmatrix} x\\y \end{bmatrix} x=xy
同时有一个协向量:
l = a b \mathbf l= \begin{bmatrix} a\\b \end{bmatrix} l=ab
这里暂时不考虑平移,只研究二维线性变换。
我们定义一个函数:
f ( x ) = l T x f(\mathbf x)=\mathbf l^T\mathbf x f(x)=lTx
也就是:
f ( x , y ) = a x + b y f(x,y)=ax+by f(x,y)=ax+by
现在,对向量施加一个线性变换:
x ′ = A x \boxed{\mathbf x'=\mathbf A\mathbf x} x′=Ax
那么新的向量变成了 x ′ \mathbf x' x′。
问题是:
如果我们希望这个函数描述的几何关系不变,那么新的协向量 l ′ \mathbf l' l′ 应该是什么?
我们用一个实际例子来研究。
3.1 把整个平面水平拉伸2倍
设:
A = 2 0 0 1 \mathbf A= \begin{bmatrix} 2&0\\ 0&1 \end{bmatrix} A=2001
所以:
{ x ′ = 2 x y ′ = y \begin{cases} x'=2x\\ y'=y \end{cases} {x′=2xy′=y
假设原来有一条经过原点的直线:
x + y = 0 x+y=0 x+y=0
对应的系数:
l = 1 1 \mathbf l= \begin{bmatrix} 1\\1 \end{bmatrix} l=11
现在,整个平面在水平方向上拉伸2倍。
原来直线上的点:
( 1 , − 1 ) (1,-1) (1,−1)
变成:
( 2 , − 1 ) (2,-1) (2,−1)
原来的点:
( 2 , − 2 ) (2,-2) (2,−2)
变成:
( 4 , − 2 ) (4,-2) (4,−2)
那么,变换后的直线方程是什么?
因为:
x ′ = 2 x x'=2x x′=2x
所以:
x = x ′ 2 x=\frac{x'}2 x=2x′
而:
y = y ′ y=y' y=y′
代入原来的直线方程:
x + y = 0 x+y=0 x+y=0
得到:
x ′ 2 + y ′ = 0 \frac{x'}2+y'=0 2x′+y′=0
所以,新直线的系数应该是:
l ′ = 1 / 2 1 \boxed{ \mathbf l'= \begin{bmatrix} 1/2\\1 \end{bmatrix} } l′=1/21
注意,原来的直线系数是:
l = 1 1 \mathbf l= \begin{bmatrix} 1\\1 \end{bmatrix} l=11
变换以后,第一个系数竟然缩小了一半。
但是普通点的X坐标却扩大了2倍。
这说明,点的坐标变换方式与直线方程的系数变换方式不一样。
为什么?
因为它们代表的不是同一种几何对象。
四、逆矩阵究竟从哪里来?
刚才我们通过代入法得到了:
l ′ = 1 / 2 1 \mathbf l'= \begin{bmatrix} 1/2\\1 \end{bmatrix} l′=1/21
现在我们尝试将这个过程推广到一般情况。
已知点的变换:
x ′ = A x \mathbf x'=\mathbf A\mathbf x x′=Ax
假设 A \mathbf A A 可逆。
那么:
x = A − 1 x ′ \boxed{\mathbf x=\mathbf A^{-1}\mathbf x'} x=A−1x′
这一步很重要。
它的意思是:
如果我们已经知道变换后的坐标 x ′ \mathbf x' x′,就可以通过逆矩阵找回原来的坐标 x \mathbf x x。
现在看原来的直线方程:
l T x = 0 \mathbf l^T\mathbf x=0 lTx=0
我们希望将它改写成以 x ′ , y ′ x',y' x′,y′ 表示的方程。
于是,把:
x = A − 1 x ′ \mathbf x=\mathbf A^{-1}\mathbf x' x=A−1x′
代入:
l T A − 1 x ′ = 0 \mathbf l^T\mathbf A^{-1}\mathbf x'=0 lTA−1x′=0
请注意,此时:
l T A − 1 \mathbf l^T\mathbf A^{-1} lTA−1
是一个行向量。
为了将方程写成标准形式:
l ′ T x ′ = 0 \mathbf l'^T\mathbf x'=0 l′Tx′=0
我们自然可以定义:
l ′ T = l T A − 1 \boxed{\mathbf l'^T=\mathbf l^T\mathbf A^{-1}} l′T=lTA−1
现在,两边转置:
l ′ = ( l T A − 1 ) T \mathbf l'=(\mathbf l^T\mathbf A^{-1})^T l′=(lTA−1)T
这里使用矩阵转置的重要性质:
( B C ) T = C T B T \boxed{(\mathbf B\mathbf C)^T=\mathbf C^T\mathbf B^T} (BC)T=CTBT
所以:
l ′ = ( A − 1 ) T ( l T ) T \mathbf l'=(\mathbf A^{-1})^T(\mathbf l^T)^T l′=(A−1)T(lT)T
由于:
( l T ) T = l (\mathbf l^T)^T=\mathbf l (lT)T=l
于是:
l ′ = ( A − 1 ) T l \boxed{ \mathbf l'=(\mathbf A^{-1})^T\mathbf l } l′=(A−1)Tl
也就是:
l ′ = A − T l \boxed{\mathbf l'=\mathbf A^{-T}\mathbf l} l′=A−Tl
这就是逆转置矩阵的来源。
现在你应该能看到:
- 逆矩阵出现,是因为我们需要用新坐标反推出原坐标,然后代入原来的方程。
- 转置出现,是因为我们要把得到的行向量形式重新写成列向量形式。
并不是协向量有什么神秘的数学规定,而是由这个代入过程自然推导出来的。
五、为什么刚才的例子符合逆转置公式?
我们来验证。
原来的变换矩阵:
A = 2 0 0 1 \mathbf A= \begin{bmatrix} 2&0\\ 0&1 \end{bmatrix} A=2001
它的逆矩阵:
A − 1 = 1 / 2 0 0 1 \mathbf A^{-1}= \begin{bmatrix} 1/2&0\\ 0&1 \end{bmatrix} A−1=1/2001
由于这是对角矩阵,转置以后不变:
A − T = 1 / 2 0 0 1 \mathbf A^{-T}= \begin{bmatrix} 1/2&0\\ 0&1 \end{bmatrix} A−T=1/2001
原来的直线系数:
l = 1 1 \mathbf l= \begin{bmatrix} 1\\1 \end{bmatrix} l=11
所以:
l ′ = A − T l \mathbf l'=\mathbf A^{-T}\mathbf l l′=A−Tl
得到:
l ′ = 1 / 2 0 0 1 1 1 = 1 / 2 1 \mathbf l'= \begin{bmatrix} 1/2&0\\ 0&1 \end{bmatrix} \begin{bmatrix} 1\\1 \end{bmatrix}= \begin{bmatrix} 1/2\\1 \end{bmatrix} l′=1/200111=1/21
因此,新直线方程是:
1 2 x ′ + y ′ = 0 \frac12x'+y'=0 21x′+y′=0
和刚才用代入法得到的结果完全相同。
这里由于矩阵比较特殊,逆矩阵和逆转置矩阵恰好相同。对于一般矩阵,它们并不相同。
六、再解释一下:协向量与普通向量到底是什么关系?
我们可以把两者的区别理解得更深入一些。
普通向量可以看作一个具有方向、长度的几何对象。
比如:
v = 1 2 \mathbf v= \begin{bmatrix} 1\\2 \end{bmatrix} v=12
可以表示一个位移方向。
而协向量:
l = 3 4 \mathbf l= \begin{bmatrix} 3\\4 \end{bmatrix} l=34
可以用来定义一个线性函数:
f ( v ) = 3 v x + 4 v y f(\mathbf v)=3v_x+4v_y f(v)=3vx+4vy
它的作用是:输入一个向量,输出一个标量。
从这个角度看:
| 普通向量 | 协向量 |
|---|---|
| 表示方向、位移等 | 表示作用于向量的线性规则 |
| 线性变换为 v ′ = A v \mathbf v'=\mathbf A\mathbf v v′=Av | 对应变换为 l ′ = A − T l \mathbf l'=\mathbf A^{-T}\mathbf l l′=A−Tl |
| 通常写成列向量 | 可表示为列向量,但作用于向量时写成行向量 |
| 属于向量空间 V V V | 属于对偶空间 V ∗ V^* V∗ |
这里你可能会有一个新疑问:
既然协向量也用几个数字表示,而且计算时还使用点积,为什么不能把它理解成普通向量?
其实,在标准欧氏坐标系里,我们确实经常用普通向量来表示协向量。
比如直线:
a x + b y + c = 0 ax+by+c=0 ax+by+c=0
其中:
( a , b ) (a,b) (a,b)
既可以看作直线方程系数,也可以看作直线的法向量。
但这并不意味着两者在任意坐标变换下都具有相同的变换规则。
在欧氏空间中,通过内积,我们可以建立普通向量与协向量之间的对应关系。
例如:
f ( x ) = n ⋅ x f(\mathbf x)=\mathbf n\cdot\mathbf x f(x)=n⋅x
这里普通向量 n \mathbf n n 就代表了一个协向量。
然而,能够通过内积建立对应关系,不代表二者在任意变换下采用相同的变换方式。
尤其是对于非等比例缩放、错切等变换,这种区别就非常明显。
七、最后联系你之前学习的齐次坐标
前面我们为了方便推导,使用的是二维线性变换:
x ′ = A x \mathbf x'=\mathbf A\mathbf x x′=Ax
它只能表达以原点为中心的线性变换。
如果考虑平移、旋转、缩放和投影,就需要使用齐次坐标:
x ~ ′ = H x ~ \tilde{\mathbf x}'=\mathbf H\tilde{\mathbf x} x~′=Hx~
其中:
x ~ = x y 1 \tilde{\mathbf x}= \begin{bmatrix} x\\y\\1 \end{bmatrix} x~= xy1
而二维直线表示为:
l ~ = a b c \tilde{\mathbf l}= \begin{bmatrix} a\\b\\c \end{bmatrix} l~= abc
原来的直线方程:
l ~ T x ~ = 0 \tilde{\mathbf l}^T\tilde{\mathbf x}=0 l~Tx~=0
因为:
x ~ = H − 1 x ~ ′ \tilde{\mathbf x}=\mathbf H^{-1}\tilde{\mathbf x}' x~=H−1x~′
代入:
l ~ T H − 1 x ~ ′ = 0 \tilde{\mathbf l}^T\mathbf H^{-1}\tilde{\mathbf x}'=0 l~TH−1x~′=0
因此定义:
l ~ ′ T = l ~ T H − 1 \tilde{\mathbf l}'^T=\tilde{\mathbf l}^T\mathbf H^{-1} l~′T=l~TH−1
最终:
l ~ ′ = H − T l ~ \boxed{ \tilde{\mathbf l}'=\mathbf H^{-T}\tilde{\mathbf l} } l~′=H−Tl~
所以前面二维线性变换的推导,可以直接推广到二维射影变换。
不过对于射影几何,直线系数本身只定义到一个非零比例倍数,所以:
l ~ ′ ∼ H − T l ~ \tilde{\mathbf l}'\sim\mathbf H^{-T}\tilde{\mathbf l} l~′∼H−Tl~
是更一般的写法。
八、我希望你真正理解的一个区别
以前学习点积时,我们通常认为:
a ⋅ b \mathbf a\cdot\mathbf b a⋅b
就是两个向量之间的一种运算。
这种理解没有问题。
但现在我们进一步发现:
l T x \mathbf l^T\mathbf x lTx
还可以从另一个角度解释:
一个协向量作为线性函数,作用于一个普通向量,得到一个标量。
于是,一旦坐标发生变换,我们就需要让这两类对象的变换相互配合,以保证原来的几何关系。
这就是逆转置矩阵的本质来源。
你现在可以只记住下面这个推导链条:
原直线方程: l T x = 0 点变换: x ′ = A x 反解原坐标: x = A − 1 x ′ 代入直线方程: l T A − 1 x ′ = 0 定义新直线系数: l ′ T = l T A − 1 l ′ = A − T l \begin{aligned} &\text{原直线方程:}\quad \mathbf l^T\mathbf x=0\\4pt &\text{点变换:}\quad \mathbf x'=\mathbf A\mathbf x\\4pt &\text{反解原坐标:}\quad \mathbf x=\mathbf A^{-1}\mathbf x'\\4pt &\text{代入直线方程:}\quad \mathbf l^T\mathbf A^{-1}\mathbf x'=0\\4pt &\text{定义新直线系数:}\quad \mathbf l'^T=\mathbf l^T\mathbf A^{-1}\\4pt &\boxed{\mathbf l'=\mathbf A^{-T}\mathbf l} \end{aligned} 原直线方程:lTx=0点变换:x′=Ax反解原坐标:x=A−1x′代入直线方程:lTA−1x′=0定义新直线系数:l′T=lTA−1l′=A−Tl
真正值得记住的不是逆转置这个公式,而是为什么要把逆变换代入原来的直线方程。
因为我们改变的是点的位置,但又要求这些点在变换后仍满足对应的新直线方程。
这才是整个推导最根本的几何逻辑。
最后我想问你一个针对性的理解问题:
假设原来有一条直线:
x = 3 x=3 x=3
现在整个平面在X方向缩小一半:
x ′ = 1 2 x x'=\frac12x x′=21x
那么,你认为新的直线应该是 x ′ = 1.5 x'=1.5 x′=1.5,还是 x ′ = 6 x'=6 x′=6?
如果你能从点的位置变化而不是套公式来判断,就说明已经抓住了协向量变换的核心思路。
问题2
之前第9.5节后面还提到了三维法向量、古典伴随矩阵(Adjugate Matrix),以及它们与协向量的关系,但当时确实跳得太快了。
尤其是下面三个问题,之前没有解释清楚:
- 为什么二维直线的系数需要用逆转置矩阵变换,三维法向量也需要?
- 古典伴随矩阵究竟是什么?为什么它和逆矩阵有关?
- 为什么原文说逆转置矩阵与伴随矩阵等价?它们明明不是同一个矩阵。
我们接着刚才已经理解的知识,把这些内容串起来。
一、为什么三维法向量也需要使用逆转置矩阵?
先回顾刚才的结论。
对于二维直线:
a x + b y + c = 0 ax+by+c=0 ax+by+c=0
如果二维点发生齐次坐标变换:
x ~ ′ = H x ~ \tilde{\mathbf x}'=\mathbf H\tilde{\mathbf x} x~′=Hx~
那么直线系数需要使用:
l ~ ′ = H − T l ~ \boxed{\tilde{\mathbf l}'=\mathbf H^{-T}\tilde{\mathbf l}} l~′=H−Tl~
原因是:变换前位于直线上的点,变换后仍然必须位于新直线上。
现在我们把这个思想推广到三维。
1.1 三维法向量是什么?
在二维空间中,一条直线可以表示为:
a x + b y + c = 0 ax+by+c=0 ax+by+c=0
其中:
n = a b \mathbf n= \begin{bmatrix} a\\b \end{bmatrix} n=ab
是直线的法向量。
它与直线的方向垂直。
那么在三维空间中,一个平面可以表示为:
a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0
其中:
n = a b c \boxed{ \mathbf n= \begin{bmatrix} a\\b\\c \end{bmatrix} } n= abc
是平面的法向量。
它与平面上的所有方向向量垂直。
例如,一个水平面:
z = 2 z=2 z=2
可以写成:
0 x + 0 y + z − 2 = 0 0x+0y+z-2=0 0x+0y+z−2=0
因此,它的法向量是:
n = 0 0 1 \mathbf n= \begin{bmatrix} 0\\0\\1 \end{bmatrix} n= 001
也就是竖直向上的方向。
所以,你可以把二维直线和三维平面联系起来:
| 二维空间 | 三维空间 |
|---|---|
| 直线 a x + b y + c = 0 ax+by+c=0 ax+by+c=0 | 平面 a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0 |
| 法向量 ( a , b ) (a,b) (a,b) | 法向量 ( a , b , c ) (a,b,c) (a,b,c) |
| 直线上的方向与法向量垂直 | 平面内的方向与法向量垂直 |
注意,在三维空间中,一条直线通常需要更多信息来描述,不能简单地由一个三维法向量确定。
1.2 为什么不能直接用普通矩阵变换法向量?
我们通过一个具体例子来理解。
假设三维空间中有一个平面:
x + y = 0 x+y=0 x+y=0
它的法向量是:
n = 1 1 0 \mathbf n= \begin{bmatrix} 1\\1\\0 \end{bmatrix} n= 110
现在把整个三维空间沿X轴拉伸2倍。
变换矩阵为:
A = 2 0 0 0 1 0 0 0 1 \mathbf A= \begin{bmatrix} 2&0&0\\ 0&1&0\\ 0&0&1 \end{bmatrix} A= 200010001
因此:
{ x ′ = 2 x y ′ = y z ′ = z \begin{cases} x'=2x\\ y'=y\\ z'=z \end{cases} ⎩ ⎨ ⎧x′=2xy′=yz′=z
我们先不考虑法向量,直接计算变换后的平面方程。
由于:
x = x ′ 2 x=\frac{x'}2 x=2x′
代入原来的平面:
x + y = 0 x+y=0 x+y=0
得到:
x ′ 2 + y ′ = 0 \frac{x'}2+y'=0 2x′+y′=0
因此新平面的法向量应该是:
n ′ = 1 / 2 1 0 \boxed{ \mathbf n'= \begin{bmatrix} 1/2\\1\\0 \end{bmatrix} } n′= 1/210
可是,如果直接用普通矩阵变换:
n ′ = A n \mathbf n'=\mathbf A\mathbf n n′=An
就会得到:
n ′ = 2 1 0 \mathbf n'= \begin{bmatrix} 2\\1\\0 \end{bmatrix} n′= 210
显然不对。
这说明:
当空间发生非等比例缩放时,法向量不能简单地使用与普通方向向量相同的变换矩阵。
1.3 那么逆转置是怎样推导出来的?
我们先使用平面方程:
n T x + d = 0 \mathbf n^T\mathbf x+d=0 nTx+d=0
其中:
x = x y z \mathbf x= \begin{bmatrix} x\\y\\z \end{bmatrix} x= xyz
现在对点进行仿射变换:
x ′ = A x + t \boxed{\mathbf x'=\mathbf A\mathbf x+\mathbf t} x′=Ax+t
这里:
- A \mathbf A A 负责旋转、拉伸、倾斜等线性变换。
- t \mathbf t t 负责平移。
因为:
x ′ = A x + t \mathbf x'=\mathbf A\mathbf x+\mathbf t x′=Ax+t
所以:
x = A − 1 ( x ′ − t ) \mathbf x=\mathbf A^{-1}(\mathbf x'-\mathbf t) x=A−1(x′−t)
将其代入原来的平面方程:
n T A − 1 ( x ′ − t ) + d = 0 \mathbf n^T\mathbf A^{-1}(\mathbf x'-\mathbf t)+d=0 nTA−1(x′−t)+d=0
展开:
n T A − 1 x ′ − n T A − 1 t + d = 0 \mathbf n^T\mathbf A^{-1}\mathbf x'- \mathbf n^T\mathbf A^{-1}\mathbf t +d=0 nTA−1x′−nTA−1t+d=0
而新的平面方程应该写成:
n ′ T x ′ + d ′ = 0 \mathbf n'^T\mathbf x'+d'=0 n′Tx′+d′=0
对比两个公式。
新法向量必须满足:
n ′ T = n T A − 1 \mathbf n'^T=\mathbf n^T\mathbf A^{-1} n′T=nTA−1
两边转置:
n ′ = A − T n \boxed{ \mathbf n'=\mathbf A^{-T}\mathbf n } n′=A−Tn
同时:
d ′ = d − n ′ T t d'=d-\mathbf n'^T\mathbf t d′=d−n′Tt
所以得到了:
{ n ′ = A − T n d ′ = d − n ′ T t \boxed{ \begin{cases} \mathbf n'=\mathbf A^{-T}\mathbf n\\ d'=d-\mathbf n'^T\mathbf t \end{cases} } {n′=A−Tnd′=d−n′Tt
这实际上与二维直线的推导完全一致。
因为二维直线和三维平面都可以由一个线性方程描述,所以它们的方程系数遵循相同的逆转置变换规律。
注意:这里计算出来的 n ′ \mathbf n' n′ 不一定是单位法向量。如果我们需要单位长度,还要进行归一化:
n ^ ′ = n ′ ∥ n ′ ∥ \hat{\mathbf n}'=\frac{\mathbf n'}{\|\mathbf n'\|} n^′=∥n′∥n′
另外,这里讨论的是可逆仿射变换。对于一般三维射影变换,应当使用包含平面偏移系数在内的四维齐次平面系数,并通过 4 × 4 4\times4 4×4 矩阵的逆转置变换。
二、为什么纯旋转时,法向量又可以直接乘旋转矩阵?
你可能会想到前面学习的旋转矩阵:
R T R = I \mathbf R^T\mathbf R=\mathbf I RTR=I
因此:
R − 1 = R T \mathbf R^{-1}=\mathbf R^T R−1=RT
那么:
R − T = ( R − 1 ) T \mathbf R^{-T}= (\mathbf R^{-1})^T R−T=(R−1)T
代入:
R − T = ( R T ) T \mathbf R^{-T}=(\mathbf R^T)^T R−T=(RT)T
由于转置两次得到原矩阵:
R − T = R \boxed{\mathbf R^{-T}=\mathbf R} R−T=R
所以法向量的变换:
n ′ = R − T n \mathbf n'=\mathbf R^{-T}\mathbf n n′=R−Tn
就变成了:
n ′ = R n \boxed{\mathbf n'=\mathbf R\mathbf n} n′=Rn
这意味着:
对于纯旋转,普通方向向量和法向量确实可以使用同一个旋转矩阵。
但这并不意味着它们本来就具有相同的变换规律。
而是因为旋转矩阵满足正交性质,使得:
R − T = R \mathbf R^{-T}=\mathbf R R−T=R
所以两种变换恰好一致。
这一点和我们前面3.2节讨论的正交矩阵性质联系起来了。
三、古典伴随矩阵(Adjugate Matrix)是什么?
我们先理解什么是古典伴随矩阵。
3.1 从一个普通的2×2矩阵开始
假设:
A = a b c d \mathbf A= \begin{bmatrix} a&b\\ c&d \end{bmatrix} A=acbd
你应该学过它的行列式:
det ( A ) = a d − b c \det(\mathbf A)=ad-bc det(A)=ad−bc
如果:
a d − b c ≠ 0 ad-bc\neq0 ad−bc=0
那么逆矩阵为:
A − 1 = 1 a d − b c d − b − c a \boxed{ \mathbf A^{-1}= \frac{1}{ad-bc} \begin{bmatrix} d&-b\\ -c&a \end{bmatrix} } A−1=ad−bc1d−c−ba
这里我们可以把逆矩阵拆成两个部分:
第一部分:
1 det ( A ) \frac1{\det(\mathbf A)} det(A)1
第二部分:
d − b − c a \] \\begin{bmatrix} d\&-b\\\\ -c\&a \\end{bmatrix} \[d−c−ba
而第二部分就是这个矩阵的古典伴随矩阵:
adj ( A ) = d − b − c a \boxed{ \operatorname{adj}(\mathbf A)= \begin{bmatrix} d&-b\\ -c&a \end{bmatrix} } adj(A)=d−c−ba
所以:
A − 1 = adj ( A ) det ( A ) \boxed{ \mathbf A^{-1}= \frac{\operatorname{adj}(\mathbf A)} {\det(\mathbf A)} } A−1=det(A)adj(A)
将其整理:
adj ( A ) = det ( A ) A − 1 \boxed{ \operatorname{adj}(\mathbf A)= \det(\mathbf A)\mathbf A^{-1} } adj(A)=det(A)A−1
这就是古典伴随矩阵和逆矩阵之间的核心关系。
3.2 为什么古典伴随矩阵要这样构造?
我们用一个例子。
设:
A = 2 1 3 4 \mathbf A= \begin{bmatrix} 2&1\\ 3&4 \end{bmatrix} A=2314
它的行列式:
det ( A ) = 2 × 4 − 1 × 3 = 5 \det(\mathbf A)=2\times4-1\times3=5 det(A)=2×4−1×3=5
古典伴随矩阵:
adj ( A ) = 4 − 1 − 3 2 \operatorname{adj}(\mathbf A)= \begin{bmatrix} 4&-1\\ -3&2 \end{bmatrix} adj(A)=4−3−12
现在计算:
A adj ( A ) \mathbf A\operatorname{adj}(\mathbf A) Aadj(A)
即:
2 1 3 4 \] \[ 4 − 1 − 3 2 \] \\begin{bmatrix} 2\&1\\\\ 3\&4 \\end{bmatrix} \\begin{bmatrix} 4\&-1\\\\ -3\&2 \\end{bmatrix} \[2314\]\[4−3−12
得到:
8 − 3 − 2 + 2 12 − 12 − 3 + 8 \] = \[ 5 0 0 5 \] \\begin{bmatrix} 8-3\&-2+2\\\\ 12-12\&-3+8 \\end{bmatrix}= \\begin{bmatrix} 5\&0\\\\ 0\&5 \\end{bmatrix} \[8−312−12−2+2−3+8\]=\[5005
因此:
A adj ( A ) = det ( A ) I \boxed{ \mathbf A\operatorname{adj}(\mathbf A)= \det(\mathbf A)\mathbf I } Aadj(A)=det(A)I
这不是巧合,而是古典伴随矩阵的一般性质。
对于任意方阵:
A adj ( A ) = adj ( A ) A = det ( A ) I \boxed{ \mathbf A\operatorname{adj}(\mathbf A)= \operatorname{adj}(\mathbf A)\mathbf A= \det(\mathbf A)\mathbf I } Aadj(A)=adj(A)A=det(A)I
如果行列式非零,两边除以行列式,就得到:
A ( adj ( A ) det ( A ) ) = I \mathbf A \left( \frac{\operatorname{adj}(\mathbf A)} {\det(\mathbf A)} \right)= \mathbf I A(det(A)adj(A))=I
根据逆矩阵的定义:
A A − 1 = I \mathbf A\mathbf A^{-1}=\mathbf I AA−1=I
所以:
A − 1 = adj ( A ) det ( A ) \boxed{ \mathbf A^{-1}= \frac{\operatorname{adj}(\mathbf A)} {\det(\mathbf A)} } A−1=det(A)adj(A)
因此,你可以把古典伴随矩阵理解为:
它是构造逆矩阵时使用的一个矩阵,只需再除以原矩阵的行列式,就得到逆矩阵。
对于 3 × 3 3\times3 3×3 矩阵,古典伴随矩阵通过各元素对应的代数余子式组成矩阵后再转置得到,构造过程稍复杂,但与逆矩阵之间的关系完全相同。
四、古典伴随矩阵和逆转置矩阵到底有什么关系?
对于二维直线:
l ~ ′ = H − T l ~ \tilde{\mathbf l}'=\mathbf H^{-T}\tilde{\mathbf l} l~′=H−Tl~
我们已经知道:
adj ( H ) = det ( H ) H − 1 \operatorname{adj}(\mathbf H)= \det(\mathbf H)\mathbf H^{-1} adj(H)=det(H)H−1
两边转置:
adj ( H ) T = det ( H ) ( H − 1 ) T \operatorname{adj}(\mathbf H)^T= \det(\mathbf H)(\mathbf H^{-1})^T adj(H)T=det(H)(H−1)T
所以:
adj ( H ) T = det ( H ) H − T \boxed{ \operatorname{adj}(\mathbf H)^T= \det(\mathbf H)\mathbf H^{-T} } adj(H)T=det(H)H−T
于是:
H − T = adj ( H ) T det ( H ) \mathbf H^{-T}= \frac{\operatorname{adj}(\mathbf H)^T} {\det(\mathbf H)} H−T=det(H)adj(H)T
也就是说:
逆转置矩阵和古典伴随矩阵的转置,只差一个整体比例系数。
注意这里有一个重要细节:
严格来说,对应的是古典伴随矩阵的转置,而不是没有转置的古典伴随矩阵。
4.1 为什么在射影几何中,可以忽略这个比例系数?
我们之前已经学过:
二维直线:
a x + b y + c = 0 ax+by+c=0 ax+by+c=0
如果把整个方程乘以2:
2 a x + 2 b y + 2 c = 0 2ax+2by+2c=0 2ax+2by+2c=0
描述的仍然是同一条直线。
因此:
( a , b , c ) (a,b,c) (a,b,c)
和:
( 2 a , 2 b , 2 c ) (2a,2b,2c) (2a,2b,2c)
表示同一条射影直线。
一般来说:
( a , b , c ) ∼ ( k a , k b , k c ) \boxed{ (a,b,c)\sim(k a,k b,k c) } (a,b,c)∼(ka,kb,kc)
其中:
k ≠ 0 k\neq0 k=0
因此:
H − T l ~ \mathbf H^{-T}\tilde{\mathbf l} H−Tl~
和:
det ( H ) H − T l ~ \det(\mathbf H)\mathbf H^{-T}\tilde{\mathbf l} det(H)H−Tl~
表示相同的直线。
而:
det ( H ) H − T = adj ( H ) T \det(\mathbf H)\mathbf H^{-T}= \operatorname{adj}(\mathbf H)^T det(H)H−T=adj(H)T
所以:
H − T l ~ ∼ adj ( H ) T l ~ \boxed{ \mathbf H^{-T}\tilde{\mathbf l} \sim \operatorname{adj}(\mathbf H)^T\tilde{\mathbf l} } H−Tl~∼adj(H)Tl~
这就是原文所说的"等价"。
不是说两个矩阵的元素一定相等,而是:
它们作用于齐次直线坐标后,得到的结果只差一个非零比例系数,因此表示同一个几何对象。
这一点非常重要。
五、为什么二维直线、三维法向量和古典伴随矩阵会同时出现?
现在我们可以把整条逻辑链连接起来。
首先,二维直线可以表示为:
l ~ T x ~ = 0 \tilde{\mathbf l}^T\tilde{\mathbf x}=0 l~Tx~=0
因此,如果点发生变换:
x ~ ′ = H x ~ \tilde{\mathbf x}'=\mathbf H\tilde{\mathbf x} x~′=Hx~
那么直线系数应该满足:
l ~ ′ = H − T l ~ \tilde{\mathbf l}'=\mathbf H^{-T}\tilde{\mathbf l} l~′=H−Tl~
同样地,三维平面可以表示为:
n T x + d = 0 \mathbf n^T\mathbf x+d=0 nTx+d=0
在可逆仿射变换下:
x ′ = A x + t \mathbf x'=\mathbf A\mathbf x+\mathbf t x′=Ax+t
法向量满足:
n ′ = A − T n \mathbf n'=\mathbf A^{-T}\mathbf n n′=A−Tn
所以二维直线系数与三维平面法向量之间存在共同的数学结构:
它们都描述了一个线性方程,必须跟随点的变换调整系数,才能保持原有的几何关系。
而古典伴随矩阵则提供了另一种表示逆转置变换的方式。
对于可逆矩阵:
A − T = adj ( A ) T det ( A ) \boxed{ \mathbf A^{-T}= \frac{\operatorname{adj}(\mathbf A)^T} {\det(\mathbf A)} } A−T=det(A)adj(A)T
因此,对于只关心方向的法向量,或者只关心几何位置的齐次直线系数,在适当条件下,可以使用古典伴随矩阵的转置来计算,再根据需要归一化。
不过,实际使用时必须注意:如果需要保持方程系数的具体数值,而不仅仅是它们定义的几何方向或零点集合,那么就不能随意忽略比例系数。
六、最后再补充一个容易混淆的地方:为什么法向量还可以通过叉乘得到?
这也和你之前学习的三维直线有关。
在三维空间中,假设平面上有两个不平行的方向向量:
u , v \mathbf u,\mathbf v u,v
那么法向量可以通过叉乘计算:
n = u × v \boxed{\mathbf n=\mathbf u\times\mathbf v} n=u×v
为什么?
因为叉乘的结果同时垂直于两个参与叉乘的向量。
所以它自然垂直于这两个向量张成的平面。
现在,假设空间经过线性变换:
A \mathbf A A
原来的两个方向向量变成:
u ′ = A u \mathbf u'=\mathbf A\mathbf u u′=Au
v ′ = A v \mathbf v'=\mathbf A\mathbf v v′=Av
新法向量可以通过叉乘得到:
n ′ = u ′ × v ′ \mathbf n'=\mathbf u'\times\mathbf v' n′=u′×v′
也就是:
n ′ = ( A u ) × ( A v ) \mathbf n'=(\mathbf A\mathbf u)\times(\mathbf A\mathbf v) n′=(Au)×(Av)
这里有一个非常重要的恒等式:
( A u ) × ( A v ) = det ( A ) A − T ( u × v ) \boxed{ (\mathbf A\mathbf u)\times(\mathbf A\mathbf v)= \det(\mathbf A)\mathbf A^{-T} (\mathbf u\times\mathbf v) } (Au)×(Av)=det(A)A−T(u×v)
这里要求 A \mathbf A A 是可逆的 3 × 3 3\times3 3×3 矩阵。
将:
n = u × v \mathbf n=\mathbf u\times\mathbf v n=u×v
代入:
n ′ = det ( A ) A − T n \boxed{ \mathbf n'= \det(\mathbf A)\mathbf A^{-T}\mathbf n } n′=det(A)A−Tn
你发现了吗?
它再次出现了:
A − T \mathbf A^{-T} A−T
而且还多了:
det ( A ) \det(\mathbf A) det(A)
这其实正是古典伴随矩阵转置的形式:
n ′ = adj ( A ) T n \boxed{ \mathbf n'= \operatorname{adj}(\mathbf A)^T\mathbf n } n′=adj(A)Tn
这里得到的 n ′ \mathbf n' n′ 是两个变换后方向向量的叉乘,它的长度还包含面积缩放信息。
如果只关心法向量的方向,那么在忽略非零比例因子后,它和前面推导的:
n ′ ∼ A − T n \mathbf n'\sim\mathbf A^{-T}\mathbf n n′∼A−Tn
是一致的。
这里还要注意,行列式可能为负,直接叉乘得到的法向量方向可能因此反转;如果只考虑无方向的平面法线,这不影响它所确定的法线方向轴。
这个恒等式也为我们提供了另一个角度,说明法向量与逆转置矩阵之间的关系。
七、把这些知识放在一起理解
现在你可以把它们串成下面这条逻辑:
点发生坐标变换 \boxed{\text{点发生坐标变换}} 点发生坐标变换
⇓ \Downarrow ⇓
原来的直线或平面方程也必须随之改变。
⇓ \Downarrow ⇓
为了保持点与直线、点与平面的关联关系:
直线系数和法向量使用逆转置变换 \boxed{\text{直线系数和法向量使用逆转置变换}} 直线系数和法向量使用逆转置变换
⇓ \Downarrow ⇓
而逆转置矩阵又满足:
A − T = adj ( A ) T det ( A ) \boxed{ \mathbf A^{-T}= \frac{\operatorname{adj}(\mathbf A)^T} {\det(\mathbf A)} } A−T=det(A)adj(A)T
⇓ \Downarrow ⇓
因为射影坐标允许整体缩放,所以在只关心几何对象时,可以忽略非零比例因子。
最终:
A − T n ∼ adj ( A ) T n \boxed{ \mathbf A^{-T}\mathbf n \sim \operatorname{adj}(\mathbf A)^T\mathbf n } A−Tn∼adj(A)Tn
你可以先记住这三个重点:
第一,法向量不是简单地跟着物体上的普通方向向量一起变化的。 它必须始终垂直于变换后的直线或平面,因此一般需要使用逆转置。
第二,古典伴随矩阵与逆矩阵关系密切。 对可逆矩阵而言,古典伴随矩阵等于行列式乘以逆矩阵。
第三,射影几何允许非零整体缩放。 所以即便两个矩阵只相差一个非零比例系数,它们仍然可以表示相同的射影几何变换。
另外,最后关于叉乘的恒等式:
( A u ) × ( A v ) = det ( A ) A − T ( u × v ) (\mathbf A\mathbf u)\times(\mathbf A\mathbf v)= \det(\mathbf A)\mathbf A^{-T}(\mathbf u\times\mathbf v) (Au)×(Av)=det(A)A−T(u×v)
你现在不需要直接记住它。 这个公式比前面几个结论更深入,后续学习三维坐标变换时再推导也完全来得及。
目前最重要的是先弄清楚:为什么法向量必须在变换后继续保持与平面垂直,以及为什么逆转置矩阵能够保证这一点。