nmity中Hermitian矩阵的IFFT

时间:2015-09-04 17:21:03

标签: python numpy matrix

我在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错误?

1 个答案:

答案 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.rfftnp.fft.irff(以及irfft2版本,在这个2D情况下)。同样,当您计算Hermitian矩阵的特征值/向量并且只想要实际输出时,请查看eigheigvalsh