NumPy中厄米特矩阵的IFFT

63lcw9qa  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(226)

我在paper中读到,厄米矩阵的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]]

我对埃尔米特矩阵的理解有误吗?还是我用错了NumPy?

gzszwxb4

gzszwxb41#

我认为这篇论文提到了一些略有不同的东西。厄米特矩阵等于其复共轭转置的矩阵。然而,实际输入的fft是“Hermite对称的”。它等于它的复共轭,但不等于它的复共轭转置。
顺便说一句,我可能会把这些术语搞糊涂了,因为我唯一听说过的“Hermite对称”矩阵是在实值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(在这个2D例子中,使用irfft2版本)。同样,当您计算厄米矩阵的特征值/向量并且只想要实际输出时,看看eigheigvalsh

mo49yndu

mo49yndu2#

正如@Joe所说,论文中提到的“厄米特矩阵”可能不是我们所熟知的普通矩阵。
我发现这篇论文实际上使用了术语“埃尔米特函数”,

它被定义为



事实上,这是厄米对称性的一个定义。你可以从我在另一个问题下写的answer中获得一些关于什么是厄米对称的知识。
如果您希望IFFT结果全为实数,则您提供的输入应满足厄米对称。
根据维基百科,当**X(k1, k2) = conj(X(N1-k1,N2-k2)**时,我们说一个2D矩阵是厄米对称的。

[[X(0, 0), X(0, 1), X(0, 2)],
 [X(1, 0), X(1, 1), X(1, 2)],
 [X(2, 0), X(2, 1), X(2, 2)]]
=
[[conj(X(3, 3)), conj(X(3, 2)), conj(X(3, 1))],
 [conj(X(2, 3)), conj(X(2, 2)), conj(X(2, 1))],
 [conj(X(1, 3)), conj(X(1, 2)), conj(X(1, 1))]]  # Hermitian-symmetric
=
[[conj(X(0, 0)), conj(X(0, 2)), conj(X(0, 1))],
 [conj(X(2, 0)), conj(X(2, 2)), conj(X(2, 1))],
 [conj(X(1, 0)), conj(X(1, 2)), conj(X(1, 1))]] # mod 3

可以通过使用@Joe的示例中的result矩阵替换上面的X矩阵来进行验证。

相关问题