2015-09-04 173 views
2

我在paper中读到了Hermitian矩阵的IFFT是所有实数的矩阵。但我无法使用numpy在Python中重现此操作。在numpy中的Hermitian矩阵的IFFT

# 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]] 

是我的埃尔米特矩阵理解了吗?或者我使用numpy错误?

+1

'0 + 1j' vs'1-1j' – cel

+0

@cel thanks!我已经解决了这个问题,但它仍然没有返回一个实数矩阵。 – Ric

回答

2

我认为这篇论文提到了稍微不同的东西。 Hermitian矩阵是一个等于它的复共轭转置的矩阵。然而,实际投入的fft是“Hermite对称”。它等于它的复共轭,但不等于它的复共轭转置。

在一个侧面说明中,我可能会觉得这个词有点混乱,因为我唯一听说过“hermite-symmetric”矩阵的时候是在真实值的fft中。尽管如此,我90%确定这是该文件所指的。

你确实有一个埃尔米特矩阵输入:

In [4]: np.allclose(m, np.conj(m).T) 
Out[4]: True 

但它不是“埃尔米特对称”:

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 ]]) 

但它不是埃尔米特,因为它不等于其共轭复数:

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


+0

感谢您的帮助!是否有可能具有Hermite对称的复数的二维矩阵?我可以制作一个Hermitian,它遵循论文中的定义,但它没有这个好的属性,ifft只给出真正的值。 – Ric

+0

我也没有看到你提到的标志差异。 Out [8]和Out [9]中的矩阵在数值和真实分量的符号上都与我相同。 – Ric