Numpy中共轭对称矩阵的IFFT

3

我在一篇文章中读到,一个共轭矩阵的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有误?
2个回答

4
我认为这篇论文提到的是略有不同的东西。厄米矩阵是指等于其复共轭转置的矩阵。然而,实数输入的fft是“厄米对称”的。它等于它的复共轭,但不等于其复共轭转置。
顺便说一下,我可能会有些混淆术语,因为我唯一听说过“厄米对称”矩阵的时候是在实数fft的背景下。尽管如此,我90%确定这就是论文所指的。
你确实有一个厄米矩阵作为输入:
In [4]: np.allclose(m, np.conj(m).T)
Out[4]: True

但它不是“Hermite对称的”:

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



谢谢你的帮助!是否可能拥有一个复数域的二维矩阵,它是 Hermite 对称的?我可以制作一个符合论文定义的 Hermitian 矩阵,但它没有 ifft 仅给出实值的这个好属性。 - Ric
我也没有看到你提到的符号差异。在Out[8]和Out[9]中的矩阵在值和实部符号方面看起来都是相同的。 - Ric
np.allclose(m, np.conj(m)) 不是测试厄米对称性的方法,而是测试实值性的方法。只有当 imag(m)imag(conj(m)) 都为零时,它们才相等。这里的对称性是指在频率 k-k 处的 FFT 结果:m[k]==conj(m[N-k]),其中 Nm 的长度,且 0<=k<N。对于二维 FFT,结果会更加复杂。 - Cris Luengo

0
正如@Joe所说,论文中提到的“Hermitian矩阵”可能不是众所周知的那个。
我发现论文实际上使用了术语“Hermitian函数”,

paper

被定义为

explanation.

实际上,这是厄米对称的定义。您可以从我在另一个问题下写的答案中了解什么是厄米对称。

如果您希望IFFT结果全部为实数,则您提供的输入应满足厄米对称性。

根据wikipedia,当X(k1, k2) = conj(X(N1-k1,N2-k2)时,我们说一个二维矩阵是厄米对称的。

[[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矩阵来进行验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接