最近在学习 PyTorch 的时候,看到文档中计算两个向量的“outer product”后得到一个矩阵。我刚开始理所当然地把“outer product”理解为高中所学的外积,即叉积。但我越想越不对劲:两个向量的叉积不应该还是向量吗,怎么会叉出矩阵来呢?查了一波资料后发现这里的“outer product”不是叉积,而是张量积。
中文里的外积一词常出现在代数、几何学等领域中。对两向量 A 与 B 而言,外积可指:
- 叉积(Cross product),又称向量积(Vector product),常写为 A×B;
- 楔积(Wedge product 或 Exterior product),常写为 A∧B;
- 张量积(Tensor product 或 Outer product),常写为 A⊗B。
上述三种都可称作外积,但含义却大相径庭,因此极易出现混淆,尤其是“exterior”和“outer”都有外面的意思,我发现网上许多文章甚至一些教科书中都出现了翻译、解释上的错误。我认为避免混淆的最好办法就是使用“叉积”、“向量积”、“楔积”、“张量积”这些没有歧义的词语,而避免使用“外积”一词。
下面是对几种外积概念的简要辨析。
一、叉积
两个向量 a 和 b 的叉积仅在三维空间中有定义,写作 a×b。在物理学中,叉积有时也被写成 a∧b,但在数学中 a∧b 是外代数中的外积(楔积)。
叉积可以定义为:
a×b=∣a∣∣b∣sinθ n
其中 sinθ 表示 a 和 b 在它们所定义的平面上的夹角(0∘≤θ≤180∘)。∣a∣ 和 ∣b∣ 是向量 a 和 b 的模长,而 n 则是一个与 a、b 所构成的平面垂直的单位向量,方向由右手定则决定。
叉积可以表达为这样的行列式:
u×v=∣∣∣∣∣∣∣iu1v1ju2v2ku3v3∣∣∣∣∣∣∣
沿第一行进行拉普拉斯展开可得:
u×v=∣∣∣∣∣u2v2u3v3∣∣∣∣∣i+∣∣∣∣∣u1v1u3v3∣∣∣∣∣j+∣∣∣∣∣u1v1u2v2∣∣∣∣∣k=(u2v3−u3v2)i−(u1v3−u3v1)j+(u1v2−u2v1)k
二、楔积
不了解,貌似是定义在张量空间上的一种运算。具体细节请移步维基百科外代数(格拉斯曼代数)词条,我反正看不懂。
三、张量积
在数学中,张量积,记为⊗,可以应用于不同的上下文中,如向量、矩阵、张量、向量空间、代数、拓扑向量空间和模。在各种情况下这个符号的意义是同样的:最一般的双线性运算。在某些上下文中也叫做外积。
向量的外积是矩阵的克罗内克积的特殊情况。
给定m×1列向量u和1×n行向量v,它们的外积u⊗v被定义为m×n矩阵A,结果出自
u⊗v=A=u v
这里的张量积就是向量的乘法。
例子:
b⊗a→⎣⎢⎢⎢⎡b1b2b3b4⎦⎥⎥⎥⎤[a1a2a3]=⎣⎢⎢⎢⎡a1b1a1b2a1b3a1b4a2b1a2b2a2b3a2b4a3b1a3b2a3b3a3b4⎦⎥⎥⎥⎤
结果的秩为1,结果的维数为 4×3 = 12。这里的秩指的是“张量秩”(所需指标数),而维数计算在结果数组(阵列)中自由度的数目。