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