我在paper中读到Hermitian矩阵的IFFT是所有实数的矩阵。但我无法使用numpy在Python中重现这一点。
# Hermitian matrix: https://en.wikipedia.org/wiki/Hermitian_matrix
m = [[2 , 2 + 1j, 4 ],
[2 - 1j, 3 , 0 + 1j],
[4 , 0 - 1j, 1 ]]
m = numpy.matrix(m)
im = numpy.fft.ifft2(m)
print im
这给出了以下不仅仅是实物:
[[ 2.00000000+0.j 0.42955838-0.16666667j 0.23710829-0.16666667j]
[ 0.23710829+0.16666667j -0.66666667-0.57735027j 0.38490018+0.j ]
[ 0.42955838+0.16666667j -0.38490018+0.j -0.66666667+0.57735027j]]
我对Hermitian矩阵的理解是否已经消除?或者我使用numpy错误?
答案 0 :(得分:2)
我认为这篇论文提到了一些略有不同的东西。 Hermitian矩阵是一个与其复共轭转置相等的矩阵。但是,实际输入的fft
是" Hermite-symmetric"。它等于其复共轭,但不是它的复共轭转置。
另一方面,我可能会对这些术语感到有些困惑,因为我唯一一次听说过" hermite-symmetric"矩阵是在真实价值的fft的背景下。尽管如此,我90%肯定这是论文所指的内容。
你确实有一个Hermitian矩阵作为输入:
In [4]: np.allclose(m, np.conj(m).T)
Out[4]: True
但它不是" hermite-symmetric":
In [5]: np.allclose(m, np.conj(m))
Out[5]: False
但是,让我们来看看当我们采用实际值的fft时会发生什么:
In [6]: data = np.arange(9).reshape(3, 3)
In [7]: result = np.fft.fft2(data)
请注意,由此产生的fft(几乎)与其复杂的共轭相同(在一个术语的符号上存在差异,我不理解。如果有人,我会感激解释知道!):
In [8]: result
Out[8]:
array([[ 36.0+0.j , -4.5+2.6j, -4.5-2.6j],
[-13.5+7.8j, 0.0+0.j , 0.0+0.j ],
[-13.5-7.8j, 0.0+0.j , 0.0+0.j ]])
In [9]: np.conj(result)
Out[9]:
array([[ 36.0-0.j , -4.5-2.6j, -4.5+2.6j],
[-13.5-7.8j, 0.0-0.j , 0.0-0.j ],
[-13.5+7.8j, 0.0-0.j , 0.0-0.j ]])
但它不是Hermitian,因为它不等于它复杂的共轭转置:
In [10]: np.conj(result).T
Out[10]:
array([[ 36.0-0.j , -13.5-7.8j, -13.5+7.8j],
[ -4.5-2.6j, 0.0-0.j , 0.0-0.j ],
[ -4.5+2.6j, 0.0-0.j , 0.0-0.j ]])
无论如何,这可能不是完整的答案,但希望它能让你朝着正确的方向迈出一步。
在实践中,如果您正在使用真实输入,并且您只想获得实际输出,请使用np.fft.rfft
和np.fft.irff
(以及irfft2
版本,在这个2D情况下)。同样,当您计算Hermitian矩阵的特征值/向量并且只想要实际输出时,请查看eigh
和eigvalsh
。