matlab与python中FFT线性代数的不一致性

时间:2017-02-02 00:07:39

标签: python matlab fft linear ifft

首先,道歉堆栈溢出不支持乳胶格式化,因此我将复合共轭称为*,将hermitian共轭称为'。

我有四个前后FFT和iFFT运算符(用于在Fortran格式中存储为1D的3D矢量,其中S是我的3D数组的形状):

def cI(in_vec):
    fft_vec = in_vec.reshape(S, order='F')
    fft_vec = np.fft.fftn(fft_vec, S)
    return fft_vec.reshape(-1, order='F')

def cJ(in_vec):
    ifft_vec = in_vec.reshape(S, order='F')
    ifft_vec = np.ifft.fftn(fft_vec, S)
    return fft_vec.reshape(-1, order='F')

def cIdag(in_vec):
    return np.prod(S) * cJ(in_vec)

def cJdag(in_vec):
    return 1. / np.prod(S) * cI(in_vec)

要验证我的操作员,我想检查以确保:

对于所有向量a和b,

(a'Jb)* == b'I'a和(a'Jb)* == b'J'a。

我正在处理一个最初用MATLAB编写的问题集,并且正在使用python进行编写。在MATLAB中确实如此:

conj(a'*cI(b)) == b'*cIdag(a)

conj(a'*cJ(b)) == b'cJdag(a)

当a和b是真正的向量时,我正在我的python版本中工作。但是,这种检查在复杂时会失败。我的支票:

a=np.random.rand(np.prod(S),1)+1j*np.random.rand(np.prod(S),1)
b=np.random.rand(np.prod(S),1)+1j*np.random.rand(np.prod(S),1)
res1 = np.conj(np.dot(np.conj(a).T, cI(b)))
res2 = np.dot(np.conj(b).T, cIdag(a))

和res1!= res2。

1 个答案:

答案 0 :(得分:0)

解决了我的问题,我的操作员是Hermitian,这是我的测试错了。我应该做的:

a=np.random.rand(np.prod(S))+1j*np.random.rand(np.prod(S))
b=np.random.rand(np.prod(S))+1j*np.random.rand(np.prod(S))

而不是

a=np.random.rand(np.prod(S),1)+1j*np.random.rand(np.prod(S),1)
b=np.random.rand(np.prod(S),1)+1j*np.random.rand(np.prod(S),1)