首先,道歉堆栈溢出不支持乳胶格式化,因此我将复合共轭称为*,将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。
答案 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)