矩阵乘法运算(普通乘积、哈达玛积、克罗内克积)

1 普通乘积(matmul product)

        若 A A A 是 m × n m \times n m×n 矩阵, B B B 是 n × p n \times p n×p 矩阵, B B B 的列是 b 1 , ⋯   , b p b_1, \cdots, b_p b1​,⋯,bp​,则乘积 A B AB AB 是 m × p m \times p m×p 矩阵,它的各列是 A b 1 , ⋯   , A b p Ab_1, \cdots, Ab_p Ab1​,⋯,Abp​,即
A B = A [ b 1 b 2 ⋯ b p ] = [ A b 1 A b 2 ⋯ A b p ] AB = A[b_1 \quad b_2 \quad \cdots \quad b_p] = [Ab_1 \quad Ab_2 \quad \cdots \quad Ab_p] AB=A[b1​b2​⋯bp​]=[Ab1​Ab2​⋯Abp​]
        提示: 线性变换可以用矩阵来表示,而矩阵乘法对应线性变换的复合。
计算 A B AB AB 的行列法则
        若乘积 A B AB AB 有定义, A B AB AB 的第 i i i 行第 j j j 列的元素是 A A A 的第 i i i行与 B B B 的第 j j j 列对应元素乘积之和。若 ( A B ) i j (AB)_{ij} (AB)ij​ 表示 A B AB AB 的 ( i , j ) (i ,j) (i,j) 元素, A A A 为 m × n m \times n m×n 矩阵,则
( A B ) i j = ∑ k = 1 n a i k b k j = a i 1 b 1 j + a i 2 b 2 j + ⋯ + a i n b n j (AB)_{ij} = \sum_{k=1}^{n}a_{ik}b_{kj}= a_{i1}b_{1j} + a_{i2}b_{2j} + \cdots + a_{in}b_{nj} (AB)ij​=k=1∑n​aik​bkj​=ai1​b1j​+ai2​b2j​+⋯+ain​bnj​

        下面用图片做演示:
矩阵乘法运算(普通乘积、哈达玛积、克罗内克积)

矩阵乘法运算(普通乘积、哈达玛积、克罗内克积)

2 哈达玛积(Hadamard product)

        Hadamard乘积 是矩阵的一类运算,对形状相同的矩阵进行运算,并产生相同维度的第三个矩阵。在数学中,Hadamard乘积(也称为 Schur乘积或逐元素乘积)是一种二元运算,它用两个具有相同维数的矩阵产生另一个具有相同维数的矩阵,其中每个元素 ( i , j ) (i, j) (i,j) 是原始两个矩阵的元素 ( i , j ) (i, j) (i,j) 的乘积。它是由法国数学家雅克·哈达玛(Jacques Hadamard)或德国数学家Issai Schur命名的。

        两个同阶的 m × n m \times n m×n 矩阵 A = [ a i j ] A = [a_{ij}] A=[aij​] 与矩阵 B = [ b i j ] B = [b_{ij}] B=[bij​] 的Hadamard积,记为 A ⊙ B A \odot B A⊙B。新矩阵元素定义为矩阵A、B对应元素的乘积,即
( A ⊙ B ) i j = a i j ∗ b i j (A \odot B{)_{ij}} = {a_{ij}}*{b_{ij}} (A⊙B)ij​=aij​∗bij​

矩阵乘法运算(普通乘积、哈达玛积、克罗内克积)矩阵乘法运算(普通乘积、哈达玛积、克罗内克积)

3 克罗内克积(Kronecker Product)

        Kronecker 积 是两个任意大小矩阵间的运算,表示为 A ⊗ B A \otimes B A⊗B。如果 A A A 是一个 m × n m \times n m×n 的矩阵,而 B B B 是一个 p × q p \times q p×q 的矩阵,克罗内克积则是一个 m p × n q mp \times nq mp×nq 的分块矩阵。克罗内克积也称为直积或张量积,以德国数学家利奥波德·克罗内克命名。计算过程如下:
A ⊗ B = [ a 11 B ⋯ a 1 n B ⋮ ⋱ ⋮ a m 1 B ⋯ a m n B ] A\otimes B=\begin{bmatrix}a_{11}B&\cdots&a_{1n}B\\\vdots&\ddots&\vdots\\a_{m1}B&\cdots&a_{mn}B\end{bmatrix} A⊗B=⎣⎢⎡​a11​B⋮am1​B​⋯⋱⋯​a1n​B⋮amn​B​⎦⎥⎤​
        更具体地可表示为:
A ⊗ B = [ a 11 b 11 a 11 b 12 ⋯ a 11 b 1 q ⋯ ⋯ a 1 n b 11 a 1 n b 12 ⋯ a 1 n b 1 q a 11 b 21 a 11 b 22 ⋯ a 11 b 2 q ⋯ ⋯ a 1 n b 21 a 1 n b 22 ⋯ a 1 n b 2 q ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋱ ⋮ a 11 b p 1 a 11 b p 2 ⋯ a 11 b p q ⋯ ⋯ a 1 n b p 1 a 1 n b p 2 ⋯ a 1 n b p q ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ a m 1 b 11 a m 1 b 12 ⋯ a m 1 b 1 q ⋯ ⋯ a m n b 11 a m n b 12 ⋯ a m n b 1 q a m 1 b 21 a m 1 b 22 ⋯ a m 1 b 2 q ⋯ ⋯ a m n b 21 a m n b 22 ⋯ a m n b 2 q ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋱ ⋮ a m 1 b p 1 a m 1 b p 2 ⋯ a m 1 b p q ⋯ ⋯ a m n b p 1 a m n b p 2 ⋯ a m n b p q ] A\otimes B=\begin{bmatrix} a_{11}b_{11}&a_{11}b_{12}&\cdots&a_{11}b_{1q}& \cdots&\cdots&a_{1n}b_{11}&a_{1n}b_{12}&\cdots&a_{1n}b_{1q}\\ a_{11}b_{21}&a_{11}b_{22}&\cdots&a_{11}b_{2q}& \cdots&\cdots&a_{1n}b_{21}&a_{1n}b_{22}&\cdots&a_{1n}b_{2q}\\ \vdots&\vdots&\ddots&\vdots&&&\vdots&\vdots&\ddots&\vdots\\ a_{11}b_{p1}&a_{11}b_{p2}&\cdots&a_{11}b_{pq}& \cdots&\cdots&a_{1n}b_{p1}&a_{1n}b_{p2}&\cdots&a_{1n}b_{pq}\\ \vdots&\vdots&&\vdots&\ddots&&\vdots&\vdots&&\vdots\\ \vdots&\vdots&&\vdots&&\ddots&\vdots&\vdots&&\vdots\\ a_{m1}b_{11}&a_{m1}b_{12}&\cdots&a_{m1}b_{1q}& \cdots&\cdots&a_{mn}b_{11}&a_{mn}b_{12}&\cdots&a_{mn}b_{1q}\\ a_{m1}b_{21}&a_{m1}b_{22}&\cdots&a_{m1}b_{2q}& \cdots&\cdots&a_{mn}b_{21}&a_{mn}b_{22}&\cdots&a_{mn}b_{2q}\\ \vdots&\vdots&\ddots&\vdots&&&\vdots&\vdots&\ddots&\vdots\\ a_{m1}b_{p1}&a_{m1}b_{p2}&\cdots&a_{m1}b_{pq}& \cdots&\cdots&a_{mn}b_{p1}&a_{mn}b_{p2}&\cdots&a_{mn}b_{pq} \end{bmatrix} A⊗B=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​a11​b11​a11​b21​⋮a11​bp1​⋮⋮am1​b11​am1​b21​⋮am1​bp1​​a11​b12​a11​b22​⋮a11​bp2​⋮⋮am1​b12​am1​b22​⋮am1​bp2​​⋯⋯⋱⋯⋯⋯⋱⋯​a11​b1q​a11​b2q​⋮a11​bpq​⋮⋮am1​b1q​am1​b2q​⋮am1​bpq​​⋯⋯⋯⋱⋯⋯⋯​⋯⋯⋯⋱⋯⋯⋯​a1n​b11​a1n​b21​⋮a1n​bp1​⋮⋮amn​b11​amn​b21​⋮amn​bp1​​a1n​b12​a1n​b22​⋮a1n​bp2​⋮⋮amn​b12​amn​b22​⋮amn​bp2​​⋯⋯⋱⋯⋯⋯⋱⋯​a1n​b1q​a1n​b2q​⋮a1n​bpq​⋮⋮amn​b1q​amn​b2q​⋮amn​bpq​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​

        提示: 一个列向量乘以一个行向量称作向量的外积,外积是一种特殊的克罗内克积,结果是一个矩阵。


4 Python 实现

from numpy import array, array_equal, kron

A = array([[3, 1], [1, 3]])

B = array([[5, -1], [-1, 5]])

H = array([[15, -1], [-1, 15]])

AB = array([[14, 2], [2, 14]])

K = array([[15, -3, 5, -1], [-3, 15, -1, 5], [5, -1, 15, -3], [-1, 5, -3, 15]])

# Hadamard product
assert (array_equal(A * B, H))

# Ordinary matrix product
assert (array_equal(A @ B, AB))

# Kronecker Product
assert (array_equal(kron(A, B), K))

参考

上一篇:JAVA(Scanner输入)


下一篇:互联网AB Test与金融营销中的Control-Target组测试