计算方法
一个复数可以写成极坐标形式:
z
=
r
e
i
θ
z=re^{i\theta}
z=reiθ.这种分解,左边代表长度,右边代表角度。由此为灵感来源,前人对矩阵也有类似的分解。就是猜想一个线性变换对矩阵的作用,是不是可以分解为拉长和旋转两部分呢?或者说,一个矩阵是不是可以分解为长度和角度呢?前人经过研究,发现是可以这样分解的。一个矩阵A可以分解为一个酉矩阵和正定埃尔米特阵的乘积,也就是:
A
=
U
∣
T
∣
A=U|T|
A=U∣T∣
需要注意的是右边虽然是一个绝对值符号,但是不是一个数字,而是一个矩阵。 它的定义是
∣
T
∣
=
T
H
T
|T|=\sqrt{T^HT}
∣T∣=THT,虽然我们没学过矩阵函数,但是也能知道给矩阵
A
A
A开根号就是求一个矩阵
B
B
B,它乘自己得到
A
A
A。这个埃尔米特阵用来代表长度。而前面那个酉矩阵用来代表角度。这样就把线性变换的两大作用进行了分解。
极分解的计算方法严重依赖于奇异值分解。假设已经求出来了奇异值分解,那么矩阵的极分解就很容易得到了:
A
=
(
U
V
H
)
(
V
Σ
V
H
)
A=(UV^H)(V\Sigma V^H)
A=(UVH)(VΣVH)
比如以下就是一个极分解:
(
0
1
0
0
0
0
2
0
0
0
0
3
0
0
0
0
)
=
(
0
1
0
0
0
0
1
0
0
0
0
1
1
0
0
0
)
(
0
0
0
0
0
1
0
0
0
0
2
0
0
0
0
3
)
\begin{pmatrix}0 & 1 & 0 & 0\\ 0 & 0 & 2 & 0\\ 0 & 0 & 0 & 3\\ 0 & 0 & 0 & 0\\ \end{pmatrix}=\begin{pmatrix}0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1\\ 1 & 0 & 0 & 0\\ \end{pmatrix} \begin{pmatrix}0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 2 & 0\\ 0 & 0 & 0 & 3\\ \end{pmatrix}
0000100002000030
=
0001100001000010
0000010000200003
代码实现
因为严重依赖奇异值分解,所以极分解的代码相当简单:
# 极分解
def polar_decomposition(self):
u, sigma, v = self.svd()
v_h = v.hermitian_transpose()
return u * v_h, v * sigma * v_h