2015-09-04 163 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