在2000年前,矩阵乘法的规范是行向量表示(矩阵后乘),其实这种表示更符合信号变换的基向量展开公式,但是2000年后,规范就改为了列向量表示(矩阵前乘),在两年前MATLAB将最后没改部分也改成了列向量表示。虽然我不知道为什么改成列向量表示,我也无所谓规范是矩阵后乘还是矩阵前乘,但是规范才能让我们更方便交流,就像洗衣机的高度都是一样的,方便装修的道理是一样的。然而,python中矩阵向量乘积用的是行向量表示方式,又带回了2000年前,那些数学基础不好的,又表达不清楚的,就会让这个世界很混乱。
这是我很佩服的一人,对这段历史的说明。
仿射变换矩阵
这些矩阵定义了仿射变换和投影变换,包括平移、旋转、刚体变换和相似变换。在接下来的讨论中,我将重点关注仿射变换,但相同的概念也适用于投影变换。
在二维空间中,仿射变换矩阵是一个3×33 \times 33×3矩阵,它通过矩阵乘法将二维点(u,v)(u, v)(u,v)进行映射,如下所示:
[xy1]=[abcdef001]×[uv1]=A×[uv1] \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = A \times \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}xy1=ad0be0cf1×uv1=A×uv1
当仿射变换如上所示书写时,AAA的第三行总是[001][0 \quad 0 \quad 1][001]。因为矩阵出现在它所乘的向量之前,称之为前乘约定(premultiply convention)。
还有另一种书写此运算的方式。可以对一切进行转置,像这样:
[xy1]=[uv1]×[ad0be0cf1]=[uv1]×B \begin{bmatrix} x & y & 1 \end{bmatrix} = \begin{bmatrix} u & v & 1 \end{bmatrix} \times \begin{bmatrix} a & d & 0 \\ b & e & 0 \\ c & f & 1 \end{bmatrix} = \begin{bmatrix} u & v & 1 \end{bmatrix} \times B[xy1]=[uv1]×abcdef001=[uv1]×B
在这种形式中,矩阵出现在向量之后,因此我称之为后乘约定(postmultiply convention)。请注意,AAA和BBB通过矩阵转置相关联:A=B⊤A = B^{\top}A=B⊤,且B=A⊤B = A^{\top}B=A⊤。