zl程序教程

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

当前栏目

3.2 埃尔米特转置

3.2 转置
2023-09-14 09:06:54 时间

定义

  对于复矩阵,转置又不一样,常见的操作是共轭转置,也叫埃尔米特转置Hermitian transpose。埃尔米特转置就是对矩阵先共轭,再转置,一般来说用三种符号表示埃尔米特转置:

  1. 第一种符号是 A H A^H AH,这是国内教材通用的做法,H是埃尔米特名字首字母;
  2. 第二种符号是 A ∗ A^* A,这是国外教材喜欢用,这个符号在国内教材表示伴随矩阵,如以下文档:
    在这里插入图片描述
  3. 第三种符号是匕首符号 A † A^{\dagger} A,但是有时候也用来表示矩阵的加号逆。

  求埃尔米特转置的代码比较简单,python就一行代码:

    # 埃尔米特转置
    def hermitian_transpose(self):
        return Matrix([[e.conjugate() for e in v] for v in self.__vectors]).transpose_matrix()

  测试了一个矩阵:
( 1 − i 6 − i 2 − 8 i 2 + i 5 + i 4 − i ) H = ( 1 + i 2 − i 6 + i 5 − i 2 + 8 i 4 + i ) \begin{pmatrix}1-i & 6-i & 2-8i\\ 2+i & 5+i & 4-i\\ \end{pmatrix}^H= \begin{pmatrix}1+i & 2-i\\ 6+i & 5-i\\ 2+8i & 4+i\\ \end{pmatrix} (1i2+i6i5+i28i4i)H= 1+i6+i2+8i2i5i4+i

埃尔米特阵

  如果一个矩阵,埃尔米特转置后还是它自己,这样的矩阵就是埃尔米特阵。毫无疑问,矩阵必须得是一个方阵。所以它的判断方式也很简单,首先判断是否为方阵,再以对角线为对称轴判断就完事了,但是要注意数据类型,把复数和其他类型区分开来,所以代码会稍微长一点:

# 是否埃尔米特阵
    def is_hermitian(self):
        m = len(self.__vectors[0])
        n = len(self.__vectors)
        if m != n:
            return False
        # 遍历每一行对角线以上的元素
        for i in range(m):
            for j in range(i+1, n):
                e = self.__vectors[j][i]
                f = self.__vectors[i][j]

                if isinstance(e, complex):
                    if e != f.conjugate():
                        return False
                else:
                    if e != f:
                        return False
        return True

  比如以下矩阵就是一个埃尔米特阵:
( 1 − i 2 − i 3 + i 2 + i 5 + i 3 + i 3 − i 3 − i 3 − i ) \begin{pmatrix}1-i & 2-i & 3+i\\ 2+i & 5+i & 3+i\\ 3-i & 3-i & 3-i\\ \end{pmatrix} 1i2+i3i2i5+i3i3+i3+i3i

酉矩阵

  一个方阵的逆矩阵恰好是自己的埃尔米特转置,这样的矩阵被称为酉矩阵unitary matrix,也就是:
A A H = A H A = I AA^H=A^HA=I AAH=AHA=I
   A A H = A H A AA^H=A^HA AAH=AHA这个定义就限制了必须为方阵。所以它的判断也比较简单:

   # 是否为酉矩阵
    def is_unitary(self):
        m = len(self.__vectors[0])
        n = len(self.__vectors)
        if m != n:
            return False
        x = self * self.hermitian_transpose()
        return x.is_identity()
    
    # 是否为单位矩阵
    def is_identity(self):
        m = len(self.__vectors[0])
        n = len(self.__vectors)
        if m != n:
            return False
        for i in range(n):
            for j in range(n):
                if i == j:
                    if self.__vectors[i][j] != 1:
                        return False
                elif self.__vectors[i][j] != 0:
                        return False
        return True

  比如以下两个矩阵就是一个酉矩阵:
( 0.5 − 0.5 i − 0.5 + 0.5 i 0.5 i 0.5 0.5 + 0.5 i 0.5 + 0.5 i − 0.5 + 0.5 i 0 ) ( 0.5 − 0.5 i 0.5 − 0.5 i 0.5 i 0.5 − 0.5 − 0.5 i − 0.5 − 0.5 i 0.5 − 0.5 i 0 ) = ( 1 0 0 0 1 0 0 0 1 ) \begin{pmatrix}0.5 & -0.5i & -0.5+0.5i\\ 0.5i & 0.5 & 0.5+0.5i\\ 0.5+0.5i & -0.5+0.5i & 0\\ \end{pmatrix}\begin{pmatrix}0.5 & -0.5i & 0.5-0.5i\\ 0.5i & 0.5 & -0.5-0.5i\\ -0.5-0.5i & 0.5-0.5i & 0\\ \end{pmatrix}\\=\begin{pmatrix}1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{pmatrix} 0.50.5i0.5+0.5i0.5i0.50.5+0.5i0.5+0.5i0.5+0.5i0 0.50.5i0.50.5i0.5i0.50.50.5i0.50.5i0.50.5i0 = 100010001