四大坐标系的转换10——协向量

文章目录

问题1

第9.5节的协向量(Co-vector)。

这里最容易让人困惑的是:

  1. 为什么 ( a , b , c ) (a,b,c) (a,b,c) 可以看作协向量,而不仅仅是一个普通向量?
  2. 为什么说协向量是一种"作用于向量的线性函数"?
  3. 为什么普通向量和协向量采用不同的变换规则?
  4. 逆转置矩阵到底是怎么出现的?

我重新从最基础的二维直线开始解释,不预先使用协向量这个概念。

一、先回到我们已经理解的二维直线

假设二维平面上有一条直线:

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),以及它们与协向量的关系,但当时确实跳得太快了。

尤其是下面三个问题,之前没有解释清楚:

  1. 为什么二维直线的系数需要用逆转置矩阵变换,三维法向量也需要?
  2. 古典伴随矩阵究竟是什么?为什么它和逆矩阵有关?
  3. 为什么原文说逆转置矩阵与伴随矩阵等价?它们明明不是同一个矩阵。

我们接着刚才已经理解的知识,把这些内容串起来。

一、为什么三维法向量也需要使用逆转置矩阵?

先回顾刚才的结论。

对于二维直线:

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)

你现在不需要直接记住它。 这个公式比前面几个结论更深入,后续学习三维坐标变换时再推导也完全来得及。

目前最重要的是先弄清楚:为什么法向量必须在变换后继续保持与平面垂直,以及为什么逆转置矩阵能够保证这一点。

相关推荐
一招合理1 小时前
人工智能:增强智能,而非替代人类
人工智能
浅安的邂逅1 小时前
261014-Google 发布 Gemini 4 Argon:面向复杂工程与科研任务的前沿模型
人工智能·ai模型·行业动态·产品发布/更新·模型发布/更新
xianghongtao01161 小时前
SkillScaffold_论文解读报告
人工智能·深度学习
虎鲸不是鱼2 小时前
AI 自动化逆向(六)AI 解一个 9 万条目的资源容器
人工智能·自动化·大模型·ai逆向·自动化逆向
杨婷1232 小时前
2026 企业微信 SCRM 与服务商测评:私域获客、会话存档、AI 能力全维度评估
大数据·人工智能·企业微信
俊哥V2 小时前
AI一周事件 · 2026-10-07 至 2026-10-13
人工智能·ai
俊哥V2 小时前
每日 AI 研究简报 · 2026-10-14
人工智能·ai
鬼手爱剪辑2 小时前
短剧翻译哪个模型最好?200 部剧、15 个语种近 30 个模型实测(2026 年 10 月更新)
人工智能
一个有温度的技术博主2 小时前
第四讲:技术实战:给智能体装上“心脏起搏器”——详解 Agent Loop 四相循环
人工智能·驾驭工程