【矩阵乘法】一眼秒懂的矩阵乘法,从空间变换到图像压缩:矩阵乘法的四种视角

117 阅读5分钟

知乎原贴:zhuanlan.zhihu.com/p/191300139…

前言

矩阵乘法可以用多种视角去理解。 在特定的场合下,不同的视角可以带来最符合应用场景的直觉。

规定

本文所有向量默认是列向量。V1表示列向量

[v1v2v3]\begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix}

V1^T 表示行向量。

[v1v2v3]\begin{bmatrix} v_1 & v_2 & v_3 \end{bmatrix}

(T是转置符号,就是把躺着的向量变成竖着)

矩阵表示的三种视角

矩阵既可以视作列向量的集合,也可以视作行向量的集合,后文将根据不同的应用场景灵活切换这两种视角。

逐元素表示

A=[a11a12a13a21a22a23a31a32a33]A=\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}

列向量的集合

A=[V1V2V3]A=\begin{bmatrix} V_1 & V_2 & V_3 \end{bmatrix}

其中V1 V2 V3分别是。

V1=[a11a21a31] \mathbf{V1} = \begin{bmatrix} a_{11} \\ a_{21} \\ a_{31} \end{bmatrix}
V2=[a12a22a32]\mathbf{V2} = \begin{bmatrix} a_{12} \\ a_{22} \\ a_{32} \end{bmatrix}
V3=[a13a23a33]\mathbf{V3} = \begin{bmatrix} a_{13} \\ a_{23} \\ a_{33} \end{bmatrix}

行向量的集合

[V1TV2TV3T]\left[ \begin{array}{c} - V_1^T - \\ - V_2^T - \\ - V_3^T - \end{array} \right]

其中V1 V2 V3分别是

V1T=[a11a12a13] \mathbf{V1}^T = \begin{bmatrix} a_{11} & a_{12} & a_{13} \end{bmatrix}
V2T=[a21a22a23] \mathbf{V2}^T = \begin{bmatrix} a_{21} & a_{22} & a_{23} \end{bmatrix}
V3T=[a31a32a33] \mathbf{V3}^T = \begin{bmatrix} a_{31} & a_{32} & a_{33} \end{bmatrix}

矩阵乘法视角1(列向量线性组合)

引入:坐标表示的矩阵解读

给一个标准坐标系, 并且给你一个坐标[1,2,3],会很自然的指出这位置在哪。 但是给一个非标准坐标系,和一个非标准坐标系下的坐标 [1,2,3],该如何求解他的世坐标

回忆一下坐标表示法,位置 [1,2,3]指得是。 1x坐标轴1+2x坐标轴2+3x坐标轴3。 在标准坐标系下,把标准坐标系写成矩阵形式,其中坐标轴分别为v1 v2 v3

A=[100010001]=[V1V2V3]A=\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} =\begin{bmatrix} V_1 & V_2 & V_3 \end{bmatrix}
V1=[100]V2=[010]V3=[001]\mathbf{V1} = \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} \mathbf{V2} = \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} \mathbf{V3} = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}

坐标就是[1,2,3],他发生了以下运算。

[123]=1[100]+2[010]+3[001]\begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} = 1 \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} + 2 \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} + 3 \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}

Pasted image 20250602135011.png

在非标准坐标系下,假设坐标轴是v1 v2 v3。 最终坐标即是所有系数分别乘列向量,最后组合在一起即:

1V1+2V2+3V3=[a11+2a12+3a13a21+2a22+3a23a31+2a32+3a33]1 \mathbf{V}_1 + 2 \mathbf{V}_2 + 3 \mathbf{V}_3 = \begin{bmatrix} a_{11} + 2a_{12} + 3a_{13} \\ a_{21} + 2a_{22} + 3a_{23} \\ a_{31} + 2a_{32} + 3a_{33} \end{bmatrix}

Pasted image 20250602135310.png

(由于任意坐标系的数值可能不固定,此处省略具体数值计算,仅保留结构形式)

这就列向量的线性组合。 矩阵乘向量可以用向量系数对坐标轴进行线性组合解释。 几何意义就是矩阵作为本地坐标系,向量作为本地坐标系下的坐标。乘法运算后将本地坐标转换到世界坐标。

应用

旋转 缩放 挤压一个物体。 我们写出操作后的坐标系,然后把原有的向量 乘在右边即可。 (看起来就好像我们在操作魔法去改变空间,然后再把物体塑造成我们想要的样子)

例如 有原始坐标p1 需要对他旋转。 求得旋转后的坐标系A,将p视做A的本地坐标P_local A * P_local =  P_world

结论

矩阵x向量 可以视做: 矩阵列向量组成一个坐标系, 向量就是取这坐标系的系数。 使用系数组合坐标轴向量,将本地坐标转换到世界坐标。

AVa=[V1V2V3]Va=Va[1]V1+Va[2]V2+Va[3]V3A * V_a = \begin{bmatrix} V_1 & V_2 & V_3 \end{bmatrix} * V_a = V_a[1] * V_1 + V_a[2] * V_2 + V_a[3] * V_3

矩阵x矩阵。 我们直接把右边的矩阵视为另一个坐标系,将分解成3个列向量。 照着套以上矩阵x向量即可。意义就是 我们把定义在一个本地坐标系下的坐标系转化到世界坐标系下的表示。

矩阵乘法视角2(行向量点乘投影)

引入:世界空间转换到局部空间

已知世界坐标是[1,2,3],局部坐标系由v1 v2 v3向量组成的坐标系,并且v1 v2 v3==正交==(正交指的是向量两两相互垂直),怎么拿到这个世界坐标的在局部坐标系下怎么表示 容易猜到,我们去调整 v1 v2 v3向量的混合比例总能组合出我们的目标[1,2,3]。

设比例为x1,x2,x3,可以获得以下方程

x1V1+x2V2+x3V3=[123]T x_1 * V_1 + x_2*V_2 + x_3*V_3= \begin{bmatrix} 1&2&3 \end{bmatrix}^T

写成矩阵形式

[V1V2V3][x1x2x3]=[123]\begin{bmatrix} V_1 & V_2 & V_3 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix} = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix}

取坐标系矩阵的逆

[V1V2V3][123]=[x1x2x3]\begin{bmatrix} V_1 & V_2 & V_3 \end{bmatrix}^- \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix}

矩阵是正交有性质

A1=AT A^{-1} = A^T

[V1TV2TV3T][123]=[x1x2x3]\left[ \begin{array}{c} - V_1^T- \\ - V_2^T - \\ - V_3^T - \end{array} \right] \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} =\begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix}

以上的形式可以展开向量点乘(内积)

V1T[123]=x1V_1^T * \begin{bmatrix} 1\\2\\3 \end{bmatrix} = x1
V2T[123]=x2V_2^T * \begin{bmatrix} 1\\2\\3 \end{bmatrix} = x2
V3T[123]=x3V_3^T * \begin{bmatrix} 1\\2\\3 \end{bmatrix} = x3

坐标系正交的情况下。我们把世界坐标下的向量点乘到局部坐标系上。就可以获得得局部坐标系下的坐标

结论

矩阵乘向量,可以视作矩阵行向量去点乘向量。在正交坐标系下可以认为,我们通过点乘,把这个世界坐标下的向量分解为三个局部坐标系向量,世界坐标变换到局部。 矩阵乘矩阵同上,右边的矩阵看成是列向量的集合即可。

应用

坐标变换,世界坐标转局部坐标 函数变换(傅里叶变换,勒让德变换,球谐函数变换) 这些函数变换需要定义基函数,也就是坐标系。 我们将手上函数去点乘基函数,就能获得系数。

矩阵乘法视角3(多个秩1矩阵的和)

这个用的少,但是在图片压缩会有很强的解释。

向量外积(Outer Product)

引入向量外积,外积就是列向量乘行向量。其实可以看成两个矩阵相乘

UV=[u1um][v1vn]=[u1v1u1vnumv1umvn]\mathbf{U} \mathbf{V}^\top = \begin{bmatrix} u_1 \\ \vdots \\ u_m \end{bmatrix} \begin{bmatrix} v_1 & \cdots & v_n \end{bmatrix} = \begin{bmatrix} u_1v_1 & \cdots & u_1v_n \\ \vdots & \ddots & \vdots \\ u_mv_1 & \cdots & u_mv_n \end{bmatrix}
[abc][xyz]=[axayazbxbybzcxcycz] \begin{bmatrix} a \\ b \\ c \end{bmatrix} \begin{bmatrix} x & y & z \end{bmatrix} = \begin{bmatrix} ax & ay & az \\ bx & by & bz \\ cx & cy & cz \end{bmatrix}

向量外积可以获得一个秩1矩阵。

矩阵乘法分解成张量积

AB=[a1a2a3][b1Tb2Tb3T]=a1b1T+a2b2T+a3b3TAB=\begin{bmatrix} a_1 & a_2 & a_3 \end{bmatrix} \left[ \begin{array}{c} - b_1^T - \\ - b_2^T - \\ - b_3^T - \end{array} \right] = a_1*b_1^T + a_2*b_2^T + a_3*b_3^T

显然 矩阵秩维n 我们就可以用n张秩1矩阵去拼出来。

应用

在图片压缩,有一种方式叫KL变换(或者叫SVD), 我们把图片(矩阵)先分解乘三个矩阵的乘积,矩阵U * 对角矩阵∑ *矩阵V。 展开成张量积

A=i=1rσiuiviTA = \sum_{i=1}^{r} \sigma_i \mathbf{u}_i \mathbf{v}_i^T

矩阵可以写成多个秩1矩阵的加和,我们可以直接抛弃些系数很小的部分。 去做有损压缩

SVD图片压缩.gif

原理不细说,要涉及奇异值分解。贴个文章

zhuanlan.zhihu.com/p/601291289

zhuanlan.zhihu.com/p/197385362…

矩阵乘法视角4(逐元素计算)

这是矩阵乘法最基础、最直接的定义,虽然缺乏几何直观性 但是你可以很容易的把他变成代码。(^▽^)

(AB)ij=k=1nAikBkj (AB)_{ij} = \sum_{k=1}^{n} A_{ik} B_{kj}

具体例子

[a11a12a21a22][b11b12b21b22]=[a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22]\begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix} \begin{bmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{bmatrix} = \begin{bmatrix} a_{11}b_{11} + a_{12}b_{21} & a_{11}b_{12} + a_{12}b_{22} \\ a_{21}b_{11} + a_{22}b_{21} & a_{21}b_{12} + a_{22}b_{22} \end{bmatrix}