交换矩阵 commutation matrix:理论与matlab仿真
最近接触了一些克罗内克积和 Khatri-Rao Product及向量化的相关问题, 本文记录下非常重要的一个概念: 交换矩阵。定义在线性代数中, 有一类矩阵被称为 置换矩阵 (permutation matrix):对于一个正方矩阵, 每一行和每一列有且仅有一个非零元素, 就是置换矩阵。比如:P=[100001010]\mathbf{P} =\left[\begin{array}{lll}1 &
最近接触了一些克罗内克积和 Khatri-Rao Product及向量化的相关问题, 本文记录下非常重要的一个概念: 交换矩阵。
定义
在线性代数中, 有一类矩阵被称为 置换矩阵 (permutation matrix):
对于一个正方矩阵, 每一行和每一列有且仅有一个非零元素, 就是置换矩阵。
比如:
P
=
[
1
0
0
0
0
1
0
1
0
]
\mathbf{P} =\left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{array}\right]
P=⎣⎡100001010⎦⎤
显然, 单位阵也是一种特殊的置换矩阵。
关于置换矩阵的作用, 比如我们经常希望更换矩阵 A \mathbf{A} A中行或列的排列顺序, 这样的操作可以通过对矩阵 A \mathbf{A} A:
- 左乘置换矩阵, 实现对行的重新排列
- 右乘置换矩阵, 实现对列的重新排列
这很容易理解:
[ 1 0 0 0 0 1 0 1 0 ] [ a 1 a 2 a 3 ] = [ a 1 a 3 a 2 ] \left[\begin{array}{lll} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{array}\right]\left[\begin{array}{lll} \mathbf{a}_1 \\ \mathbf{a}_2 \\ \mathbf{a}_3 \end{array}\right] = \left[\begin{array}{lll} \mathbf{a}_1 \\ \mathbf{a}_3 \\ \mathbf{a}_2 \end{array}\right] ⎣⎡100001010⎦⎤⎣⎡a1a2a3⎦⎤=⎣⎡a1a3a2⎦⎤
因此, 置换矩阵就是一类实现对行列重新排列的矩阵。 而其中最常用也最特殊的, 就是 交换矩阵 commutation matrix。
对于一个 m × n m\times n m×n的矩阵 A \mathbf{A} A, 存在一个 m n × m n mn\times mn mn×mn的置换矩阵 K m n \mathbf{K}_{mn} Kmn, 使得 K m n v e c ( A ) = v e c ( A T ) \mathbf{K}_{mn}\mathrm{vec}(\mathbf{A}) = \mathrm{vec}(\mathbf{A}^T) Kmnvec(A)=vec(AT), K m n \mathbf{K}_{mn} Kmn就是一个交换矩阵。
性质
常用的性质:
- K m n vec ( A ) = vec ( A T ) K_{m n} \operatorname{vec}(A)=\operatorname{vec}\left(A^{\mathrm{T}}\right) Kmnvec(A)=vec(AT), K n m vec ( A T ) = vec ( A ) \boldsymbol{K}_{\boldsymbol{n} m} \operatorname{vec}\left(\boldsymbol{A}^{\mathrm{T}}\right)=\operatorname{vec}(\boldsymbol{A}) Knmvec(AT)=vec(A)
- K m n T K m n = K m n K m n T = I m n \boldsymbol{K}_{m n}^{\mathrm{T}} \boldsymbol{K}_{m n}=\boldsymbol{K}_{m n} \boldsymbol{K}_{m n}^{\mathrm{T}}=\boldsymbol{I}_{m n} KmnTKmn=KmnKmnT=Imn
- K m n T = K n m \mathbf{K}_{m n}^{\mathrm{T}}=\mathbf{K}_{n m} KmnT=Knm
- K m n = ∑ j = 1 n ( e j T ⊗ I m ⊗ e j ) \boldsymbol{K}_{m n}=\sum_{j=1}^{n}\left(\mathbf{e}_{j}^{\mathrm{T}} \otimes \mathbf{I}_{m} \otimes \mathbf{e}_{j}\right) Kmn=∑j=1n(ejT⊗Im⊗ej), 其中 e j \mathbf{e}_{j} ej 是基本向量, 即只有第 j j j个元素为1,其余元素均为0.
最重要的是则是他与克罗内克积的关系:
K
m
n
(
A
⊗
B
)
K
p
q
=
B
⊗
A
\boldsymbol{K}_{m n}(\boldsymbol{A} \otimes \boldsymbol{B}) \boldsymbol{K}_{p q}=\boldsymbol{B} \otimes \boldsymbol{A}
Kmn(A⊗B)Kpq=B⊗A
其中, A \mathbf{A} A的维度是 n × p n\times p n×p, B \mathbf{B} B的维度是 m × q m\times q m×q。
同样还有和Khatri-Rao Product的关系:
K m n ( A ⊗ B ) = B ⊗ A \boldsymbol{K}_{m n}(\boldsymbol{A} \otimes \boldsymbol{B}) =\boldsymbol{B} \otimes \boldsymbol{A} Kmn(A⊗B)=B⊗A
其中,
A
\mathbf{A}
A的维度是
n
×
p
n\times p
n×p,
B
\mathbf{B}
B的维度是
m
×
p
m\times p
m×p。
很容易可以从克罗内克积的性质中推导出该式。
代码
附上生成 K m n \mathbf{K}_{mn} Kmn的matlab代码:
function K = gen_commutation(m,n)
K = 0;
for j = 1 : n
ej= zeros(n, 1);
ej(j) = 1;
K = K + (kron(kron(ej.', eye(m)), ej));
end
即,利用性质4.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)