A Feynman-Style Tutorial

几何代数入门

—— 一副看几何的新眼镜
文渊 · 撰 | 步子哥 · 阅正
费曼视角

我以费曼的视角和你聊这套东西——基于公开的著作和讲义推断,不是要替谁代言。目标是让你读完,能用自己的话把几何代数讲给一个没学过的人听。讲不出来,就是还没真懂。

其一开场:为何要再发明一次"乘法"

先说一个让我别扭了很多年的事。

学向量的时候,老师给你两个乘法。一个叫点积,$a \cdot b$,乘出来是个数——告诉你两个向量有多"同向"。另一个叫叉积,$a \times b$,乘出来是个新向量——告诉你两个向量撑开的平面是哪个,顺带给了个面积。

两个乘法。各管一摊。一个出标量,一个出向量。我那时候就纳闷:为什么是两个?两个向量相乘,难道不该有一个统一的乘法吗?凭什么要拆成两半,一半管度量、一半管方向?

这问题问出去,多半被敷衍过去。"就是这样定义的,好用。"——好用是好用,可它不美。两套乘法之间没有代数上的亲缘,点积满足交换律,叉积反对称,它们凑不到一个结合的代数里。你没法写 $(ab)c = a(bc)$,因为 $ab$ 这个东西压根没有定义。

关键这不是钻牛角尖。一个不自洽的乘法意味着:你没法对向量做"除法",没法解向量方程 $ax = b$,没法把旋转、反射、投影这些几何操作写成统一的代数。你只能一个场景一个公式,背一堆互不相干的恒等式。

其实,早在十九世纪,就有人被这事折磨过。1843 年,Hamilton 在都柏林的桥上刻下四元数 $i^2 = j^2 = k^2 = ijk = -1$,他想要的正是一个"统一的向量乘法"。1844 年,Grassmann 提出外代数,用楔积 $a \wedge b$ 编码面积和体积。两条线,一个管旋转,一个管子空间,互不搭理。

1878 年,一个叫 William Clifford 的英国人,三十三岁就早逝的数学家,把这两条线缝在了一起。他定义了一个新的乘法——后来叫几何积(geometric product)——把 Hamilton 的四元数和 Grassmann 的外积装进了同一个代数。Clifford 自己更愿意叫它"geometric algebra"。

然后呢?然后这套东西就被埋了七十年。

因为 Gibbs 和 Heaviside 从四元数里"砍"出了一套更轻便的向量分析——点积、叉积、$\nabla$ 算子——1901 年写进教科书,工程师学得快,物理够用。Clifford 代数太抽象,门槛高,就被晾在一边。直到 1960 年代,David Hestenes 在 Caltech 重新捡起它,主张这套东西该成为物理和几何的统一语言。

这套东西到底要干什么?说穿了就一句话:

宗旨给向量一个满足结合律可逆同时携带度量与方向的乘法,然后看它能把多少几何操作统一起来。

这一章我不堆定义。我只给你一个预告:在二维平面上,两个向量相乘,会乘出一个让你意外的东西——一个"数"加上一个"面积"。而那个面积元素,平方竟然是 $-1$。是不是有点眼熟?

往下走。先从最简单的地方下水。

其二二维试水:两个向量相乘的意外

拿一张纸,画两个互相垂直的单位向量,叫 $e_1$、$e_2$。这就是二维欧氏平面。

现在我要大胆地定义一个"乘法",把两个向量直接乘起来。规则很简单,就两条:

  1. 它满足结合律:$(ab)c = a(bc)$。
  2. 一个向量自己乘自己,等于它长度的平方:$a^2 = a \cdot a = \|a\|^2$。

第二条是关键。它把"乘法"和"度量"绑死了——向量自乘,得到的是一个标量,是长度平方。这跟数不一样:$3^2 = 9$,但向量 $a$ 的平方是 $\|a\|^2$,可能是个正数(欧氏空间),也可能不是(后面讲时空会见到负的)。

好,拿这两条规则去算几个东西。

第一,$e_1$ 自己乘自己:

$$ e_1 e_1 = e_1^2 = e_1 \cdot e_1 = 1 $$

单位向量自乘,得 $1$。同理 $e_2^2 = 1$。这没什么意外。

第二,$e_1$ 乘 $e_2$。它们正交,所以 $e_1 \cdot e_2 = 0$。但乘出来的东西不可能是零——零意味着"没乘出什么",可这两个向量明明撑开了一个平面啊。那 $e_1 e_2$ 到底是什么?

它是一个新的对象。不是标量,也不是我们熟悉的向量。它代表"$e_1$ 和 $e_2$ 撑开的那个有向平面"。给它起个名字,叫双向量(bivector),记作 $e_1 e_2$,或者 $e_{12}$。

双向量是什么样子?想象一个有方向的面积片。它有大小(面积多少)、有方向(哪个平面)、有定向(顺时针还是逆时针)。但它没有"法向量"——它就是平面本身,不是垂直于平面的那根轴。这一点很重要,后面会反复用到。

现在,做一件刺激的事。把 $e_1 e_2$ 再乘一次自己:

$$ (e_1 e_2)(e_1 e_2) = e_1 e_2 e_1 e_2 $$

用结合律,先算 $e_2 e_1$。注意 $e_2 e_1$ 和 $e_1 e_2$ 什么关系?用分配律展开 $(e_1 + e_2)^2$ 试试:

$$ (e_1+e_2)^2 = e_1^2 + e_1 e_2 + e_2 e_1 + e_2^2 = 2 + e_1 e_2 + e_2 e_1 $$

而 $(e_1+e_2)^2$ 按规则二应该等于 $\|e_1+e_2\|^2 = 1+1 = 2$。两相比较,得出:

$$ e_1 e_2 + e_2 e_1 = 0 \quad\Rightarrow\quad e_2 e_1 = -e_1 e_2 $$

正交向量的几何积反对称。换顺序,差个负号。这跟叉积像,但又不完全一样——叉乘出向量,这里乘出的是双向量。

回到 $(e_1 e_2)^2$。把中间的 $e_2 e_1$ 换成 $-e_1 e_2$:

$$ (e_1 e_2)^2 = e_1 (e_2 e_1) e_2 = e_1(-e_1 e_2)e_2 = -e_1 e_1 e_2 e_2 = -1 $$

停一下。

$(e_1 e_2)^2 = -1$。

一个东西,平方等于负一。这不就是虚数单位 $i$ 干的事吗?

意外二维平面里,两个正交单位向量的几何积,平方等于 $-1$。它就是虚数 $i$——只不过现在 $i$ 不再是一个"凭空发明的神秘符号",而是平面本身的方向元素

这不是巧合,也不是牵强附会。它是一个扎扎实实的代数事实:复数 $\mathbb{C}$,和二维几何代数里"标量 + 双向量"那个子集,是同构的。复数乘法,就是几何积在那个子集上的特例。第九章我会把这件事彻底讲透,现在你只要记住这个画面:虚数不是天上掉下来的,它是平面的影子

再算一个。$(e_1 + e_2) e_1$:

$$ (e_1+e_2)e_1 = e_1 e_1 + e_2 e_1 = 1 - e_1 e_2 = 1 - I $$

这里我顺手把 $e_1 e_2$ 记作 $I$(二维的单位伪标量)。结果是一个"$1$"加上一个"$-I$"——一个标量加一个双向量。这就是几何积的常态:它不保持纯度。两个向量乘出来,一般既带度量(标量部分),又带方向(双向量部分),两者并排躺在一个"混合体"里。

这个"混合体",就是下一章要拆开看的东西。

其三拆开看:内积、外积与几何积

上一章那个混合体 $1 - I$,看着怪。一个数加一个面积,像把苹果和橘子放一个篮子。其实别慌——它跟复数 $a + bi$ 是一回事:实部加虚部,不是"融合成一个数",是"在一个更大的代数里并排保留"。

现在我把这个混合体正式拆开。对任意两个向量 $a, b$,几何积可以写成:

$$ ab = a \cdot b + a \wedge b $$

右边的两项,一个是你认识的,一个可能新。

内积 $a \cdot b$:度量的那一半

就是熟悉的点积。对称:$a \cdot b = b \cdot a$。结果是标量。告诉你两个向量有多"平行"——具体说,是 $|a||b|\cos\theta$。平行时最大,正交时为零。

用 grade 的话说:两个向量(grade 1)做内积,结果降到了 grade 0(标量)。内积降维,携带度量。

外积 $a \wedge b$:方向的那一半

这是 Grassmann 的楔积。反对称:$a \wedge b = -b \wedge a$。结果是双向量(grade 2),代表两个向量撑开的有向面积。平行时为零(共线撑不出面积),正交时最大。

用 grade 的话说:两个向量(grade 1)做外积,结果升到了 grade 2(双向量)。外积升维,携带方向。

两极两个极端情形最该记牢:
平行:$a \wedge b = 0$,于是 $ab = a \cdot b$(纯标量)。特别地 $a^2 = a \cdot a = \|a\|^2$。
正交:$a \cdot b = 0$,于是 $ab = a \wedge b$(纯双向量)。

中间情形——既不平行也不正交——既出标量又出双向量,这正是几何积的一般长相。

谁先谁后?一个观念的反转

大部分教材是这样教的:先有点积、叉积,然后把它们拼成几何积。逻辑上没错,可概念上把车放到了马前面。

Clifford 的本意是反过来的:几何积才是原始运算,内积和外积是从它身上切下来的两片

怎么切?用 grade 投影。记 $\langle M \rangle_k$ 为取 $M$ 的 grade-$k$ 部分,那么:

$$ a \cdot b = \langle ab \rangle_0, \qquad a \wedge b = \langle ab \rangle_2 $$

几何积把"度量"和"方向"压进同一个乘法;内积是它的标量切片,外积是它的双向量切片。这就像一束白光穿过棱镜——白光是原始的,七色是分解出来的。先有几何积,再谈内积外积。

辨伪说"几何积 = 内积 + 外积"是定义,说"内积、外积是几何积的切片"是视角。两者代数等价,但后者更贴 Clifford 的本意,也更利于后面理解 rotor、对偶这些东西。本教程一律采用"几何积优先"的讲法。

几何积凭什么了不起

就凭三条:

  1. 结合律:$(ab)c = a(bc)$。这是它区别于内积外积的最重要性质。有了结合律,它才是一个真正的代数,才能写 $abc$ 不加括号,才能定义逆元 $a^{-1}$,才能解方程。
  2. 可逆:$a^{-1} = a / a^2$(当 $a^2 \neq 0$)。向量终于能做"除法"了。这在传统向量分析里是不可能的。
  3. 不交换:$ab \neq ba$,但 $ab + ba = 2a\cdot b$,$ab - ba = 2a\wedge b$。非交换不是缺陷,恰恰是它同时编码对称(内积)和反对称(外积)的代价。

一个乘法,既含度量又含方向,还结合还自洽。这就够开一整门代数了。下面看看它能装下多少东西。

其四升维与 blade:grade 的故事

到目前为止,我们见过的对象有三种:标量(grade 0)、向量(grade 1)、双向量(grade 2)。这条线还能往上走。

k-blade:有向 k 维体积

取 $k$ 个线性无关的向量 $a_1, a_2, \ldots, a_k$,做外积:

$$ A_{\langle k\rangle} = a_1 \wedge a_2 \wedge \cdots \wedge a_k $$

这叫一个 k-blade(k 叶)。它的几何意义是这 $k$ 个向量撑开的有向 k 维体积

grade对象几何意义例子
0标量 scalar数值 / 权重$3$, $-1.5$
1向量 vector有向线段$e_1$, $a$
2双向量 bivector有向面积片$e_1 e_2$, $a \wedge b$
3三向量 trivector有向体积块$e_1 e_2 e_3$
$n$伪标量 pseudoscalar全空间有向体积$I = e_1 e_2 \cdots e_n$

这张表是 GA 的脊梁骨,往后所有东西都挂在 grade 这条线上:内积降 grade,外积升 grade,对偶翻 grade。盯住 grade,就不会乱。

blade 不等于任意 k-向量

有个细节得说清楚。"blade"是能写成"几个向量外积"的那种 k-向量,也就是可分解的。一般的 k-向量(叫 k-vector)是若干 blade 的线性组合,不一定能分解成单个 blade。

二维里所有双向量都是 blade(都是 $e_{12}$ 的倍数)。三维里双向量也都是 blade。但到了四维以上,会出现"不可分解"的 k-向量——它们是几个 blade 叠加,却无法合并成一个。入门阶段不用纠结这个,知道有这回事就行。

伪标量 $I$:全空间的定向

$n$ 维空间里,最高 grade 的 blade 叫伪标量,记 $I = e_1 e_2 \cdots e_n$。"伪"字是说它定向反转时变号,跟真标量不一样。

$I$ 平方是多少?跟维数和度规有关。欧氏二维,$I^2 = -1$(第二章算过)。欧氏三维,$I^2 = e_1 e_2 e_3 e_1 e_2 e_3$,反推一下得 $-1$。欧氏四维,$I^2 = +1$。一般地,欧氏 $n$ 维里 $I^2 = (-1)^{n(n-1)/2}$。

别去死记这个公式。记住两件事就够:一,$I$ 代表"整个空间的定向";二,$I^2 = \pm 1$,具体符号算一次记一次。$I$ 在后面讲对偶时会反复出场,它是把"向量"和"轴"互相转换的钥匙。

直觉grade 就是"维数"。标量是零维的点,向量是一维的线,双向量是二维的面,三向量是三维的体。blade 就是"一块有方向的 k 维体积"。整个 GA,就是在玩这些不同维度的"块"之间的乘除。

其五多重向量:什么都能装的混合体

第二章末尾那个 $1 - I$,是"标量加双向量"的混合。这种混合不是病,是常态。因为几何积不保持 grade——两个向量乘出来既有 grade 0 又有 grade 2,三个向量乘出来可能更杂。要是只允许"纯 grade"的对象存在,几何积就不封闭,代数就散架了。

所以要允许混合。把所有 grade 的 blade 线性叠加起来,就得到多重向量(multivector):

$$ M = \langle M \rangle_0 + \langle M \rangle_1 + \langle M \rangle_2 + \cdots + \langle M \rangle_n $$

$\langle M \rangle_k$ 是取 $M$ 的 grade-$k$ 部分,叫 grade 投影算子。一个多重向量就像一个"抽屉柜",每个抽屉装一个 grade 的东西,互不干扰,但又同属一个柜子。

用复数破除抵触

"标量加双向量"听着别扭,那我换个说法你就熟了:复数 $a + bi$ 不就是"实部加虚部"吗?实部是标量,虚部是带个 $i$ 的东西。在二维 GA 里,$i$ 就是 $e_1 e_2$ 这个双向量。所以 $a + b\,e_1 e_2$ 和 $a + bi$ 是一回事——一个抽屉装实数,一个抽屉装"平面方向元素"。

加在一起,不是"融合成一个数",是"在一个更大的代数里并排保留"。这跟复数完全一样。NASA 的教学材料里有个很好的类比:复数的实部虚部相加不意味着"捏成一个数",而是"在 $\mathbb{C}$ 这个代数里共存"。多重向量就是这个想法的推广——只不过抽屉从两个变成 $n+1$ 个。

grade 投影:取你要的那一片

既然多重向量是混合体,我经常需要"只取标量部分"或"只取向量部分"。这就是 $\langle \cdot \rangle_k$ 的用处:

$$ \langle M \rangle_0 = \text{标量部分},\quad \langle M \rangle_1 = \text{向量部分},\quad \langle M \rangle_2 = \text{双向量部分},\ \ldots $$

前面说过,内积外积就是几何积的 grade 切片:

$$ a \cdot b = \langle ab \rangle_0,\qquad a \wedge b = \langle ab \rangle_2 $$

更一般地,两个 blade 相乘,结果会跨好几个 grade。一个 $r$-blade 和一个 $s$-blade 做几何积,结果 span 从 $|r-s|$ 到 $r+s$(步长 2)的所有 grade。比如两个双向量(grade 2)相乘,结果是 grade 0 + grade 2 + grade 4。这是几何积"溢出 grade"的本性,不是 bug。

警告多重向量的"混合"在旋转、复数这些情形下几何意义清楚。但在一般情形,一个随便拼的多重向量未必有清晰的几何含义。它是代数上的方便容器,不是每个容器都装着"一个几何对象"。Hestenes 学派有时把多重向量说得过于神乎,入门者不必照单全收。

一个具体的多重向量

在三维欧氏空间,最一般的多重向量长这样:

$$ M = \underbrace{\alpha}_{\text{标量}} + \underbrace{\mathbf{v}}_{\text{向量}} + \underbrace{\mathbf{B}}_{\text{双向量}} + \underbrace{\beta I}_{\text{伪标量}} $$

四样东西并排:一个数、一个向量、一个双向量、一个伪标量。$1 + 1 + 3 + 3 + 1 = 8$ 个实数分量——这就是为什么三维 GA 是 $2^3 = 8$ 维的。一般 $n$ 维 GA 是 $2^n$ 维,维度增长很快,这也是它在大规模数值计算上不占便宜的原因之一。

其六旋转子 rotor:从两次反射说起

这一章是 GA 的重头戏。rotor——旋转子——是 GA 最优雅、最有说服力的应用。但我不打算直接抛公式。我要从一个你能亲手比划的东西讲起:反射。

一次反射:镜面里的向量

拿一面镜子,法向量是 $\mathbf{n}$(单位向量)。向量 $\mathbf{v}$ 照镜子,镜像是 $\mathbf{v}'$。这个操作怎么写?

把 $\mathbf{v}$ 拆成"沿法向"和"切向"两部分:$\mathbf{v} = \mathbf{v}_\perp + \mathbf{v}_\parallel$,其中 $\mathbf{v}_\perp = (\mathbf{v}\cdot\mathbf{n})\mathbf{n}$ 垂直于镜面,$\mathbf{v}_\parallel$ 平行于镜面。反射把垂直部分取反,切向不变:$\mathbf{v}' = -\mathbf{v}_\perp + \mathbf{v}_\parallel$。

用几何积,这个操作有一个惊人简洁的写法:

$$ \mathbf{v}' = -\mathbf{n}\,\mathbf{v}\,\mathbf{n}^{-1} $$

两边夹,中间取反。这就是"三明治积"的雏形。你可以自己验证一下:$\mathbf{n}\mathbf{v}\mathbf{n}^{-1} = \mathbf{n}(\mathbf{v}_\perp + \mathbf{v}_\parallel)\mathbf{n}^{-1}$,利用 $\mathbf{n}$ 和 $\mathbf{v}_\perp$ 平行(几何积出标量、可交换)、和 $\mathbf{v}_\parallel$ 正交(几何积出双向量、反对称),就能化出 $-\mathbf{v}_\perp + \mathbf{v}_\parallel$。过程不复杂,自己算一遍很有收获。

两次反射 = 一次旋转:rotor 的几何起源

现在做一件妙事。再拿第二面镜子,法向量 $\mathbf{m}$,跟第一面夹角 $\theta/2$。把 $\mathbf{v}$ 先照第一面,再照第二面:

$$ \mathbf{v}'' = -\mathbf{m}(-\mathbf{n}\mathbf{v}\mathbf{n}^{-1})\mathbf{m}^{-1} = (\mathbf{m}\mathbf{n})\,\mathbf{v}\,(\mathbf{m}\mathbf{n})^{-1} $$

两个负号抵消,两个三明治积合成一个。中间那个 $\mathbf{m}\mathbf{n}$ 是两个向量的几何积——一个标量加一个双向量。给它起个名字:

$$ R = \mathbf{m}\mathbf{n}, \qquad \mathbf{v}' = R\,\mathbf{v}\,R^{-1} $$

$R$ 就是 rotor(旋转子)。两次反射的复合,是一次旋转。旋转的角度是两面镜子夹角的两倍,也就是 $\theta$。旋转所在的平面,就是 $\mathbf{m}$ 和 $\mathbf{n}$ 撑开的平面。

原来如此这一步比直接抛公式 $R = e^{-\theta\mathbf{B}/2}$ 有效十倍。它告诉你:旋转不是公设,是"两次反射"这个可触摸事实的代数后果。rotor 不是天上掉下来的,它是两面镜子夹出来的。这就是费曼式的"从具体到一般"——先让你看见,再让你抽象。

rotor 的指数形式

把 $R = \mathbf{m}\mathbf{n}$ 展开。设 $\mathbf{m}, \mathbf{n}$ 都是单位向量,夹角 $\theta/2$,那么:

$$ R = \mathbf{m}\mathbf{n} = \mathbf{m}\cdot\mathbf{n} + \mathbf{m}\wedge\mathbf{n} = \cos\frac{\theta}{2} + \mathbf{B}\sin\frac{\theta}{2} $$

其中 $\mathbf{B}$ 是旋转平面的单位双向量。习惯上写成:

$$ R = \exp\!\left(-\frac{\theta}{2}\mathbf{B}\right) = \cos\frac{\theta}{2} - \sin\frac{\theta}{2}\,\mathbf{B} $$

(差个符号约定,看 $\mathbf{B}$ 定向怎么取。)旋转公式:

$$ \mathbf{v}' = R\,\mathbf{v}\,\tilde{R} $$

这里 $\tilde{R}$ 是 $R$ 的反演(reverse,下一章详讲),就是把 $R$ 里向量的乘法顺序倒过来。对 rotor,$\tilde{R} = R^{-1}$,所以 $\tilde{R}$ 就是逆。

亲手转一个:$e_1$ 绕 $z$ 轴转 90°

把 $\mathbf{e}_1$ 绕 $z$ 轴转 $90°$。旋转平面是 $xy$ 平面,所以 $\mathbf{B} = \mathbf{e}_{12} = \mathbf{e}_1\mathbf{e}_2$,$\theta = \pi/2$。

$$ R = \cos 45° - \sin 45°\,\mathbf{e}_{12} = \frac{\sqrt{2}}{2}(1 - \mathbf{e}_{12}) $$

套三明治积 $\mathbf{v}' = R\mathbf{e}_1\tilde{R}$。展开算(耐心点,用 $\mathbf{e}_{12}\mathbf{e}_1 = \mathbf{e}_2$、$\mathbf{e}_1\mathbf{e}_{12} = -\mathbf{e}_2$ 这些),最后得到:

$$ \mathbf{e}_1 \;\mapsto\; \mathbf{e}_2 $$

$(1,0,0)$ 转成了 $(0,1,0)$。对了。$90°$ 把 $x$ 轴转到了 $y$ 轴,没毛病。

注意一个细节:$\mathbf{B}$ 直接就是平面 $\mathbf{e}_{12}$,方向由下标顺序自然给出,不需要右手法则。这是 rotor 相对四元数最直观的胜利——旋转本来就是平面里的操作,硬要找个"垂直轴"是历史包袱。三维里你习惯用"轴"想旋转,是因为三维的平面恰好跟一根轴对偶(第七章讲对偶时会揭开这层)。但旋转的本质是"在某个平面里转",不是"绕某根轴转"。

rotor vs 四元数 vs 矩阵:诚实的对比

表示奇点插值维度推广存储
欧拉角有(万向锁)不可推广3
旋转矩阵差(正交化贵)任意但臃肿9
四元数Slerp 好仅 3D4
rotorSlerp 好任意维度4(3D 中)
诚实必须说清楚:在三维里,rotor 和四元数是同一个东西。基映射 $i \leftrightarrow -\mathbf{e}_{23}$,$j \leftrightarrow -\mathbf{e}_{31}$,$k \leftrightarrow -\mathbf{e}_{12}$。存储、运算量、精度,完全一致。

所以不要信"rotor 比四元数更高效更精确"这种话——那是错的。rotor 在三维的真正价值是概念清晰度:它让你看清"为什么基平方为 $-1$"(因为它们是双向量,双向量平方为 $-1$),而不是四元数那种"凭空公设"。rotor 的实质优势在更高维度:四维空间有六个双向量基,四元数根本处理不了;以及第十一章要讲的 PGA 里统一刚体运动。

三大游戏引擎(Unity/Unreal/Godot)至今全用四元数,没有用 rotor。这不是它们落后,是三维里两者同构,没换的必要。rotor 的主战场在研究和高维,不在游戏产业。别被某些倡导文章带偏了。

其七对偶、反转与那些符号

这一章讲几个"附属运算"。它们不复杂,但符号容易把人绕晕——不同教材的记号不统一,是 GA 入门最大的坑之一。我先把约定钉死,再讲含义。

反演 $\tilde{\ }$:倒着乘回去

反演(reversion)就是把 blade 里向量的乘法顺序倒过来:

$$ \widetilde{a_1 a_2 \cdots a_k} = a_k \cdots a_2 a_1 $$

对一个 grade-$r$ 的 blade,每换一对向量出一个负号,所以:

$$ \widetilde{A_r} = (-1)^{r(r-1)/2}\, A_r $$

标量和向量不变($r=0,1$),双向量变号($r=2$),三向量不变($r=3$)……反演的关键性质是反序:$\widetilde{AB} = \tilde{B}\tilde{A}$。它的主要用途有两个:构造模方 $A\tilde{A}$,和求逆 $A^{-1} = \tilde{A}/(A\tilde{A})$。rotor 的"共轭"$\tilde{R}$ 就是反演,对 rotor 而言 $\tilde{R} = R^{-1}$。

grade 对合 $\hat{\ }$:按 grade 翻号

$$ \hat{M} = \sum_k (-1)^k \langle M \rangle_k $$

对 grade-$r$ blade:$\hat{A_r} = (-1)^r A_r$。就是"奇数 grade 取负,偶数 grade 不变"。它对应"空间反演"($\mathbf{a} \mapsto -\mathbf{a}$)在代数上的延拓。性质:$\widehat{AB} = \hat{A}\hat{B}$,保持乘法。

克利福德对合 $\bar{\ }$:前两者复合

$$ \bar{M} = \widetilde{\hat{M}} = \hat{\tilde{M}}, \qquad \bar{A_r} = (-1)^{r(r+1)/2} A_r $$

反转所有方向。是构造"广义共轭"求逆的工具。入门阶段用得不多,知道有这回事即可。

符号警告这三个算子在不同教材里符号差异极大。有的用 $\dagger$ 表反演,有的用 $\bar{}$ 表 Clifford 对合,有的用 $^\ast$ 表对偶。本教程固定用:$\tilde{}$ 反演、$\hat{}$ grade 对合、$\bar{}$ Clifford 对合、$^\ast$ 对偶。看别的教材时先对一遍符号表,否则必定混淆。这不是数学分歧,是记号分歧,但对初学者杀伤力极大。

对偶 $^\ast$:乘伪标量,grade 翻转

对偶(dual)通过乘伪标量的逆实现:

$$ M^\ast = M\,I^{-1} $$

(有的教材用 $IM$,约定不同,差个符号。本教程用 $MI^{-1}$。)

几何意义:对偶把 grade-$r$ 的对象变成 grade-$(n-r)$ 的对象。$n$ 是空间维数。在三维里,向量(grade 1)的对偶是双向量(grade 2)——这就是"向量"和"轴-角面积"互为对偶的代数根源。

叉乘的真面目:$a \times b = -I(a \wedge b)$

现在可以揭开叉乘的底了。三维里:

$$ \mathbf{a} \times \mathbf{b} = -I(\mathbf{a} \wedge \mathbf{b}) = (\mathbf{a} \wedge \mathbf{b})\,I^{-1} $$

叉乘的本质,是双向量取对偶。两个向量撑开一个有向面积(双向量 $\mathbf{a}\wedge\mathbf{b}$),在三维里这个面积恰好能对偶成一根向量——就是你熟悉的"叉乘结果"。那根"垂直于平面的轴",是三维特有的对偶产物,不是叉乘的本来面目。

这揭示叉乘两个隐藏的局限:

  1. 只在三维有定义。二维没有"垂直于平面的轴",四维里一个平面对偶出来是另一个平面而不是一根轴。只有三维,$n - 2 = 1$,平面对偶才正好是一根向量。而双向量 $\mathbf{a}\wedge\mathbf{b}$ 任意维都有定义。
  2. 破坏结合律。$\mathbf{a}\times(\mathbf{b}\times\mathbf{c}) \neq (\mathbf{a}\times\mathbf{b})\times\mathbf{c}$,所以才有 BAC-CAB 那一堆恒等式来补救。而楔积结合律良好,$\mathbf{a}\wedge(\mathbf{b}\wedge\mathbf{c}) = (\mathbf{a}\wedge\mathbf{b})\wedge\mathbf{c}$,没有这些麻烦。
辨伪说"双向量是叉乘的推广"——对。说"叉乘是错的"——夸大。在三维工程计算里,叉乘完全自洽、好用,工程师背得滚瓜烂熟。它的几何本体是双向量,被对偶化成了伪向量,仅此而已。GA 派有时把叉乘说得一文不值,那是修辞,不是事实。教程里该讲的是"叉乘的本质是什么、它的局限从哪来",而不是"叉乘该废弃"。

其八投影与拒绝:一个公式统治两分量

这一章短,但能让你尝到 GA "统一性"的甜头。

老问题:向量 $\mathbf{v}$ 在向量 $\mathbf{a}$ 上分解。传统做法,投影是 $\mathbf{v}_\parallel = \frac{\mathbf{v}\cdot\mathbf{a}}{|\mathbf{a}|^2}\mathbf{a}$,垂直分量得靠 $\mathbf{v}_\perp = \mathbf{v} - \mathbf{v}_\parallel$ 间接凑出来。一个用点积,一个用减法,不对称。

GA 给你一对称的写法:

$$ \mathbf{v}_\parallel = (\mathbf{v}\cdot\mathbf{a})\,\mathbf{a}^{-1}, \qquad \mathbf{v}_\perp = (\mathbf{v}\wedge\mathbf{a})\,\mathbf{a}^{-1} $$

点积给平行分量,楔积给垂直分量。结构完全对称。$\mathbf{a}^{-1} = \mathbf{a}/\mathbf{a}^2$ 是 $\mathbf{a}$ 的逆——还记得吗,几何积可逆,向量终于能做"除法"了,这里就用上了。

一个画面

阳光斜照一根斜杆。杆在地面投下影子,那是 $\mathbf{v}_\parallel$(沿地面方向)。杆和影子之间那段"竖起来的部分",是 $\mathbf{v}_\perp$(垂直地面方向)。

传统法:先算影子(点积),再用杆减影子得到竖段。两步,两种运算。GA:影子用点积直接拿,竖段用楔积直接拿。一步到位,对称得像镜像。

为什么这比传统法好

不只是好看。它自然推广到子空间投影。把 $\mathbf{a}$ 换成一个双向量 $\mathbf{B}$(代表一个平面),公式形式不变:

$$ \mathbf{v}_\parallel = (\mathbf{v}\cdot\mathbf{B})\,\mathbf{B}^{-1}, \qquad \mathbf{v}_\perp = (\mathbf{v}\wedge\mathbf{B})\,\mathbf{B}^{-1} $$

投影到平面、投影到直线、投影到任意子空间,同一个公式。传统向量分析里,投影到平面要另写一套(用叉乘凑),投影到三维子空间又要换写法。GA 这边一个公式通吃。

诚实在三维工业代码里,传统点积投影已经够好,性能没区别。GA 的统一性是心智负担更小,而非性能更强。它的价值在"少背几套公式、少出几个 bug",不在"跑得更快"。别又把它吹成性能神器。

其九统一之辨:复数、四元数皆入彀中

这一章是 GA "统一性"主张的核心考场。我要把"复数和四元数被 GA 吃掉了"这件事讲透——讲清楚哪些是扎扎实实的代数同构,哪些是 Hestenes 学派的修辞夸大。费曼说过,第一条原则是别骗自己。这里尤其要睁大眼。

复数:$i = e_1 e_2$

二维欧氏 GA,记 $\mathrm{Cl}(2,0)$。取正交基 $\mathbf{e}_1, \mathbf{e}_2$,伪标量 $I = \mathbf{e}_1\mathbf{e}_2$,满足 $I^2 = -1$(第二章算过)。

现在看"标量 + 双向量"这个子集:$\{a + bI \mid a, b \in \mathbb{R}\}$。它对几何积封闭(两个这种东西相乘还是这种东西),是一个子代数,叫偶子代数

把 $I$ 换名成 $i$,它就是复数 $\mathbb{C}$:

$$ (a + bI)(c + dI) = (ac - bd) + (ad + bc)I $$

正是复数乘法。所以 $\mathrm{Cl}(2,0)$ 的偶子代数与 $\mathbb{C}$ 作为 $\mathbb{R}$-代数同构。这是定理,不是修辞。

虚数 i 是什么这是 GA 最有教学价值的同构之一。$i$ 不再是"一个平方为负一的神秘符号",它是平面的有向面积元 $\mathbf{e}_1\mathbf{e}_2$。虚数的几何本体,是一个二维平面的方向元素。这解释了为什么复数天生擅长描述二维旋转——因为复数乘法就是平面里的几何积,旋转本来就在平面里发生。

但要补一句诚实的话:这是同构解释,不是说复变分析必须改用 GA。复数有自己独立的代数动机和两百年的分析理论,GA 提供了一个理解它"几何本体"的视角,不是取代。

四元数:$i, j, k$ 就是三个双向量

三维欧氏 GA,$\mathrm{Cl}(3,0)$。正交基 $\mathbf{e}_1, \mathbf{e}_2, \mathbf{e}_3$,有三个单位双向量:$\mathbf{e}_{23}, \mathbf{e}_{31}, \mathbf{e}_{12}$。

验证一下它们的乘法表(用 $\mathbf{e}_{ij}\mathbf{e}_{jk} = \mathbf{e}_{ik}$、$\mathbf{e}_{ij} = -\mathbf{e}_{ji}$ 这些规则):

$$ \mathbf{e}_{23}^2 = \mathbf{e}_{31}^2 = \mathbf{e}_{12}^2 = -1, \qquad \mathbf{e}_{23}\mathbf{e}_{31}\mathbf{e}_{12} = -1 $$

跟 Hamilton 的 $i^2 = j^2 = k^2 = ijk = -1$ 一模一样。对应关系:

$$ i \leftrightarrow -\mathbf{e}_{23},\quad j \leftrightarrow -\mathbf{e}_{31},\quad k \leftrightarrow -\mathbf{e}_{12} $$

所以 $\mathrm{Cl}(3,0)$ 的偶子代数(标量 + 三个双向量)与四元数 $\mathbb{H}$ 同构。单位四元数就是 3D 的 rotor。Hamilton 当年发明的"versor",正是 Clifford 后来所称的 rotor——同一件事,两个名字,隔了一百年。

外代数:直接嵌进来

Grassmann 的外积直接嵌入几何积的反对称部分。$\bigwedge V$ 作为子结构整体进入 Clifford 代数;当度规退化为零(所有向量自乘为零),Clifford 代数就还原为外代数。这是数学上无可争议的包含关系。

Pauli 矩阵:是 GA 的矩阵表示

物理里那三个 Pauli 矩阵 $\sigma_1, \sigma_2, \sigma_3$,满足 $\sigma_i\sigma_j = \delta_{ij} + i\epsilon_{ijk}\sigma_k$。这正是 $\mathrm{Cl}(3,0)$ 基向量的乘法表——内积部分 $\delta_{ij}$ 加双向量部分 $i\epsilon_{ijk}\sigma_k$。所以 Pauli 矩阵是 $\mathrm{Cl}(3,0)$ 的一个矩阵表示。同理 Dirac 矩阵是 $\mathrm{Cl}(1,3)$ 的表示。

Hestenes 的主张"矩阵只是表示,几何才是本体"在代数层面成立——表示论确实告诉我们这些矩阵只是 Clifford 代数的不可约表示。

真统一 vs 修辞夸大:一张表

关系数学性质评价
复数 ↔ $\mathrm{Cl}(2,0)$ 偶子代数严格 $\mathbb{R}$-代数同构真统一
四元数 ↔ $\mathrm{Cl}(3,0)$ 偶子代数严格同构,单位四元数=rotor真统一
外代数 ⊂ Clifford 代数子代数嵌入真统一
叉乘 $= -I(\mathbf{a}\wedge\mathbf{b})$3D 中的恒等式真统一,但"叉乘该废弃"是修辞
微分形式 ↔ GA平直情形等价,弯曲流形需扩展部分统一
Pauli/Dirac 矩阵 ↔ Clifford 代数矩阵表示真统一(本体-表示区分)
"GA 统一一切数学"无严格陈述货物崇拜
必须回避的夸大

GA 的统一性,在复数、四元数、外代数、Pauli/Dirac 矩阵这几条线上是扎实的代数同构,这是它最值得讲的部分。但在"统一一切数学""取代旧工具"的宏大叙事上,要守住诚实的底线——讲清力量,也讲清代价与修辞。

其十进阶:时空代数与电磁一式

前面都在欧氏空间里玩。这一章升一格,进时空——相对论的地盘。看 GA 怎么把麦克斯韦那四句话压成一句。

时空代数 STA

把 GA 搬到四维时空,度规变成 $(-,+,+,+)$ 或 $(+,-,-,-)$(看你用哪种约定)。这个 Clifford 代数记 $\mathrm{Cl}(1,3)$,Hestenes 给它起了个名叫 Spacetime Algebra(STA)。

基向量 $\mathbf{e}_0$(时间方向)自乘为 $+1$(或 $-1$),$\mathbf{e}_1, \mathbf{e}_2, \mathbf{e}_3$(空间方向)自乘为 $-1$(或 $+1$)。这种"负平方"是新的——欧氏空间里向量自乘都是正的,时空里时间方向平方为负,这正是相对论"时空距离"的代数根源。

电磁场是一个双向量

在 STA 里,电场 $\mathbf{E}$ 和磁场 $\mathbf{B}$ 不再是两个分开的向量。它们合成一个双向量

$$ F = \mathbf{E} + I\mathbf{B} $$

$I = \mathbf{e}_0\mathbf{e}_1\mathbf{e}_2\mathbf{e}_3$ 是时空伪标量。$\mathbf{E}$ 是含时间分量的双向量,$I\mathbf{B}$ 是纯空间双向量。两者相加,还是双向量。电磁场本来就是一个几何对象,只是在三维视角里被拆成了"电"和"磁"两半——就像一个三维向量在不同投影下看起来不同,电磁场在不同参考系下电场磁场会混,但 $F$ 本身不变。

麦克斯韦四式 → 一式

传统的麦克斯韦方程组,四个方程(两个散度、两个旋度):

$$ \nabla\cdot\mathbf{E} = \rho,\quad \nabla\cdot\mathbf{B} = 0,\quad \nabla\times\mathbf{E} = -\partial_t\mathbf{B},\quad \nabla\times\mathbf{B} = \partial_t\mathbf{E} + \mathbf{J} $$

在 STA 里,塌缩成一个方程:

$$ \nabla F = J $$

$\nabla$ 是时空导数($\partial_0 + \partial_1\mathbf{e}_1 + \partial_2\mathbf{e}_2 + \partial_3\mathbf{e}_3$),$J$ 是时空电流密度($\rho + \mathbf{J}$)。左边是场对时空的导数,右边是源。一个方程,把四个全包了。

冲击这是 GA 在物理中最干净的胜利。学生不再需要记四个方程哪个是散度哪个是旋度,而是看到"电磁场是一个几何对象 $F$,时空导数 $\nabla$ 作用其上,等于源 $J$"。结构透明,物理图像统一。视觉冲击力极强,适合作为"GA 为何值得学"的压轴例子。

洛伦兹变换是时空 rotor

更妙的是:在 STA 里,洛伦兹变换(boost)就是一个时空 rotor

$$ \Lambda = \exp\!\left(-\frac{\phi}{2}\,\mathbf{e}_0\mathbf{e}_i\right) $$

跟空间旋转 $R = \exp(-\frac{\theta}{2}\mathbf{e}_i\mathbf{e}_j)$ 同一个公式。这就是相对论"旋转即 boost"的几何真相——洛伦兹变换不是别的,就是时空里的旋转,只不过旋转平面含一个时间方向罢了。空间旋转和参考系变换,在 GA 里是同一类操作。

诚实必须说清楚:$\nabla F = J$ 只是更优美的重写,物理内容跟传统四式完全一样,没有新物理。它让方程更对称、几何更透明,但不预言新现象。Hestenes 学派有时暗示"GA 揭示了新物理",那是夸大。它揭示的是旧物理的几何结构,不是新物理。

另外,主流大学电磁学教材(Griffiths、Jackson)至今未采用这套写法。它活跃在 GA 圈的教学笔记里,没进主流课程。学它,是为了看清结构,不是为了应付考试。

其十一进阶:刚体运动与 motor

最后一章进阶。看 GA 怎么把"平移 + 旋转"这两件本来要凑 4×4 矩阵的事,统一成一个对象。

问题:4×4 矩阵的拼凑感

计算机图形学和机器人学里,刚体运动(旋转 + 平移)传统上用 4×4 齐次变换矩阵表示:

$$ \begin{pmatrix} R & \mathbf{t} \\ 0 & 1 \end{pmatrix} $$

$R$ 是 3×3 旋转矩阵,$\mathbf{t}$ 是平移向量。这能用,但有股拼凑味——旋转和平移是两种本质不同的操作,硬塞进一个矩阵,靠齐次坐标那一行"1"来弥合。组合两个刚体运动要矩阵相乘,求逆要分块求逆,符号上不优雅。

PGA:投影几何代数

GA 给另一个方案,叫 Projective Geometric Algebra(PGA)。在三维 PGA 里,加一个"零平方"的基向量 $\mathbf{e}_0$($\mathbf{e}_0^2 = 0$),把三维空间升到四维表示。这个 $\mathbf{e}_0$ 编码"无穷远",使得平移也能用"三明治积"形式表达——跟旋转同构。

在 PGA 里,平移、旋转、缩放都是 versor——同一个形式 $\mathbf{v}' = M\mathbf{v}M^{-1}$。刚体运动的 versor 叫 motor

$$ M = \exp\!\left(-\frac{\theta}{2}\mathbf{B} - \frac{1}{2}\mathbf{t}\wedge\mathbf{B}\right) $$

它把旋转($\mathbf{B}$ 部分)和平移($\mathbf{t}\wedge\mathbf{B}$ 部分)统一在一个对象里。组合两个刚体运动,就是两个 motor 相乘——还是 motor。求逆,就是取反演。整个刚体运动群 SE(3),在 PGA 里变成了一个干净的 versor 群。

真正卖点这是 GA 在工程上最有说服力的卖点——不是替代四元数(三维里它们同构,没得替代),而是替代整个 4×4 变换矩阵的表示哲学。平移和旋转不再是两种东西拼起来,而是同一个 motor 的两个分量。组合、求逆、插值,都统一在三明治积的形式下。

在更高维的刚体运动、在机器人学的运动学/动力学里,这种统一性优势更明显——这也是为什么机器人学是 GA 学术落地最活跃的领域。

落地真相:Klein 与那些库

bivector.net 社区列出的 GA 库不少:ganja.js(教育可视化)、clifford(Python 研究)、kingdon(Python,支持 PyTorch)、Versor、Garamon(C++ 模板)。但绝大多数定位是教育、可视化、原型

唯一明确自称"production ready"的是 Klein——C++ 写的三维 PGA 库,手写 SSE 优化,号称可替代 GLM/RTM。即便如此,Klein 仍是小众库,三大引擎没采纳。

诚实各领域渗透率:
一句话:GA 的工业落地集中在"Klein 这种小众高性能 PGA 库"和"研究级机器人学论文"两个窄缝,远未达到"颠覆线性代数"的口号级别。

其十二收尾:GA 到底好在哪

走到这,该收个尾了。我不打算给你一个"GA 伟大光明正确"的总结——那不诚实。我给你一个费曼式的、好坏都讲的交代。

力量:让几何关系变得透明

GA 真正的魅力,不是"取代现有工具",是"让几何关系变得透明"。几件事它确实干得漂亮:

这些不是吹的,是扎扎实实的代数事实。它们让"为什么这样"变得可以回答,而不是"就是这样记住就行"。

代价:符号负担与维度膨胀

但 GA 不是免费午餐。它的代价得说清:

落地:另一副眼镜,不是新眼睛

数学史反复证明一件事:统一不等于取代。张量语言统一了向量、矩阵、多重线性映射,工程师照样用矩阵;范畴论统一了大量代数结构,本科生仍先学群环域。同理,GA 提供了一个自洽的统一视角,适合做几何与物理的元层次思考,但在具体计算和教学中,传统工具的"局部最优"往往更顺手。

三大游戏引擎没用 rotor,主流电磁学教材没用 $\nabla F = J$,航天姿态控制还在用四元数。这不是它们落后,是务实选择。Hestenes "取代向量分析教学"的主张推行半个世纪未果,本身就说明强行取代不是好策略。

定位把 GA 当成另一副眼镜,不是新的眼睛。戴上它,你看旋转、看复数、看电磁场,会看到以前看不到的几何结构——这是它的价值。摘下它,该用矩阵用矩阵,该用叉乘用叉乘,该用四元数用四元数——这些工具在自己的地盘仍然最优。GA 是增项,不是替换项。

最后一句

费曼说,如果你不能把一个东西解释给大一新生听,说明你自己没真正理解。

GA 这套东西,我试着用费曼的方式讲给你了:从两个向量相乘的意外开始,到 rotor 从两次反射里长出来,到复数原来是平面的影子,到电磁场塌缩成一式。如果哪一段你还是只能背公式却讲不出"为什么",那就是我——或者这套记号——还没把它讲透。

别停在名字上。"双向量""rotor""grade"这些词本身不重要。重要的是:你能不能闭上眼,看见两个向量撑开一个有方向的平面,看见那个平面平方为负一,看见两面镜子夹出一个旋转。能看见,就懂了。看不见,就回去重算一遍 $(e_1 e_2)^2$。

事情就是这样。That's all there is to it.

—— 文渊 撰,步子哥 阅正 ——
费曼视角 · 文白相间 · 去机气
壬寅年仲夏 于工作目录