FunnyWii
FunnyWii
Published on 2024-11-27 / 27 Visits
0
0

矩阵乘法

....

老师教的差不多全还回去了。

向量

向量点积

点积(Dot product)也叫标量积(Scalar product)。在Euclidean空间也称内积(Inner product)。对应元素相乘后相加,结果是一个标量,也就是一个数。

对于向量\vec {a} = (a_1, a_2), \vec {b} = (b_1,b_2)

\vec {a} \cdot \vec {b} = a_1b_1 + a_2 b_2

在二维和三维空间,\vec {a} \cdot \vec {b}的几何意义是\vec {a} \vec {b}方向上的投影,即:

\vec {a} \cdot \vec {b}= \lvert \vec{a} \rvert \cdot \lvert \vec{b} \rvert \cdot cos\theta

Python中可以使用np.dot(a,b)实现两个向量点积的计算。

向量叉积

叉积(Cross product)又称矢量积(Vector product)或外积(Outer product),结果是一个向量。

对向量\vec {a} = (a_1, a_2,a_3), \vec {b} = (b_1,b_2,b_3) 两者叉积为\vec {a} \vec {b}的法向量,也就是\vec {a} \vec {b}构成的平面的法向量。

\vec{a} \times \vec{b} = \left|\begin{array}{ccc} \vec{i} & \vec{j} & \vec{k} \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \end{array}\right| = (a_2b_3 - a_3b_2)\vec{i} + (a_3b_1 - a_1b_3)\vec{j} + (a_1b_2 - a_2b_1)\vec{k}

注意上面是行列式计算,\vec {i}, \vec {j}, \vec {k} 分别是X,Y,Z方向上的单位向量。

最终向量的模:

\lvert \vec{a} \times \vec{b} \rvert= \left| \vec{a} \right| \cdot \lvert \vec{b} \rvert \cdot sin\theta

当向量\vec {a} \vec {b}共起点时,模为两个向量构成平行四边形的面积。

Python中可以使用np.cross(a,b)实现两个向量点积的计算。

矩阵

矩阵点乘

假设矩阵Am \times n阶,矩阵Bn \times s阶,左矩阵的列数必须和右矩阵的行数相等。结果是一个m \times s矩阵。记为A \cdot B

两个矩阵的点乘结果,即两个矩阵相乘的结果。

Python提供了np.inner(A,B) 函数实现两个矩阵点乘的计算。

点积和点乘是两个不同的数学概念,点积用于两个向量间的计算,点乘是两个矩阵间的运算。

矩阵叉积

矩阵似乎并没有叉积这个概念,但是Python和Matlab中都有对矩阵叉积的函数:np.crosscross

对于两个矩阵AB的叉积运算,使用的是向量叉积的计算方法,返回的矩阵C的是AB之间的独立叉积。

比如C(:,1)等于 A(:,1) B(:,1) 的叉积。

哈达玛积

哈达玛积(Hadamard product )也叫元素积(Element-wise product, Point-wise product)或逐项积,要求两个矩阵维度一致。对应元素逐项相乘,结果仍然是一个矩阵。记为A \circ B ,注意和上述矩阵乘法的\cdot运算符区分开。

对于两个矩阵AB

A = \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix}, \quad B = \begin{bmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{bmatrix}

哈达玛积计算为:

A \circ B = \begin{bmatrix} a_{11}b_{11} & a_{12}b_{12} \\ a_{21}b_{21} & a_{22}b_{22} \end{bmatrix}

Python中使用np.multiply或者*运算符实现哈达玛积。

弗罗比尼乌斯内积

弗罗比尼乌斯内积(Frobenius Inner Product),也要求两个矩阵维度一致,结果是一个标量,可以看作是矩阵上的“点积”(相比向量的点积)。记为A : B 。弗罗比尼乌斯内积计算为:

A : B = \sum_{i=1}^{2} \sum_{j=1}^{2} a_{ij} b_{ij} \\ A : B = a_{11}b_{11} + a_{12}b_{12} + a_{21}b_{21} + a_{22}b_{22}

克罗内克积

克罗内克积(Kronecker product)用于两个任意大小矩阵,是一种将两个矩阵组合成一个新的更大矩阵的运算。记为A \otimes B

对于两个矩阵AB,克罗内克积计算为:

A \otimes B = \begin{bmatrix} a_{11}B & a_{12}B & \cdots & a_{1n}B \\ a_{21}B & a_{22}B & \cdots & a_{2n}B \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1}B & a_{m2}B & \cdots & a_{mn}B \end{bmatrix}

若矩阵AB分别为:

A = \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix}, \quad B = \begin{bmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{bmatrix}

则克罗内克积为:

A \otimes B = \begin{bmatrix} a_{11}B & a_{12}B \\ a_{21}B & a_{22}B \end{bmatrix}

Python中使用np.kron 实现。

参考文章

[1] 矩阵乘法 - 维基百科,自由的百科全书

[2] 带你一次搞懂点积(内积)、叉积(外积)-CSDN博客


Comment