定义
对于复矩阵,转置又不一样,常见的操作是共轭转置,也叫埃尔米特转置Hermitian transpose。埃尔米特转置就是对矩阵先共轭,再转置,一般来说用三种符号表示埃尔米特转置:
- 第一种符号是 A H A^H AH,这是国内教材通用的做法,H是埃尔米特名字首字母;
- 第二种符号是
A
∗
A^*
A∗,这是国外教材喜欢用,这个符号在国内教材表示伴随矩阵,如以下文档:
- 第三种符号是匕首符号 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}
(1−i2+i6−i5+i2−8i4−i)H=
1+i6+i2+8i2−i5−i4+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}
1−i2+i3−i2−i5+i3−i3+i3+i3−i
酉矩阵
一个方阵的逆矩阵恰好是自己的埃尔米特转置,这样的矩阵被称为酉矩阵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.5i−0.5i0.5−0.5+0.5i−0.5+0.5i0.5+0.5i0
0.50.5i−0.5−0.5i−0.5i0.50.5−0.5i0.5−0.5i−0.5−0.5i0
=
100010001