zl程序教程

您现在的位置是:首页 >  其它

当前栏目

6.11 极分解

分解
2023-09-14 09:06:54 时间

计算方法

  一个复数可以写成极坐标形式: z = r e i θ z=re^{i\theta} z=reiθ.这种分解,左边代表长度,右边代表角度。由此为灵感来源,前人对矩阵也有类似的分解。就是猜想一个线性变换对矩阵的作用,是不是可以分解为拉长和旋转两部分呢?或者说,一个矩阵是不是可以分解为长度和角度呢?前人经过研究,发现是可以这样分解的。一个矩阵A可以分解为一个酉矩阵和正定埃尔米特阵的乘积,也就是:
A = U ∣ T ∣ A=U|T| A=UT
  需要注意的是右边虽然是一个绝对值符号,但是不是一个数字,而是一个矩阵。 它的定义是 ∣ 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