MATLAB与Python中FFT线性代数的离散性
堆栈溢出不支持LaTex格式,因此我将复数共轭称为MATLAB与Python中FFT线性代数的离散性,python,matlab,fft,Python,Matlab,Fft,堆栈溢出不支持LaTex格式,因此我将复数共轭称为*,而厄米特共轭称为' 对于正向和反向FFT和iFFT,我有四个运算符(对于以Fortran格式存储为1D的3D向量,其中S是我的3D数组的形状): 要验证我的操作员,我要检查以确保: (a'Jb)*==b'I'a和(a'Jb)*==b'J'a,用于所有向量a和b 我正在研究一个最初用MATLAB编写的问题集,现在用Python编写。在MATLAB中,这是正确的: conj(a'*cI(b)) == b'*cIdag(a) 及 当a和b是实向量
*
,而厄米特共轭称为'
对于正向和反向FFT和iFFT,我有四个运算符(对于以Fortran格式存储为1D的3D向量,其中S是我的3D数组的形状):
要验证我的操作员,我要检查以确保:
(a'Jb)*==b'I'a
和(a'Jb)*==b'J'a
,用于所有向量a和b
我正在研究一个最初用MATLAB编写的问题集,现在用Python编写。在MATLAB中,这是正确的:
conj(a'*cI(b)) == b'*cIdag(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解决了我的问题,我的操作员是隐士,是我的测试出错了。我应该这样做:
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)
只是为了确保:您没有混淆Matlab的转置(..)和复共轭转置('),是吗?我这么问是因为它经常发生……差异有多大?通过(res1-res2).abs().max()
,您得到了什么?如果它非常小,那么它只是普通的浮点问题。MATLAB和Python在点积上有一些可以忽略不计的数值差异。我确实想要hermitian共轭(也称为复共轭转置),而且差异远大于浮点误差,所以不是这样。我实际上并没有把res1res2语句,我打印出了这两个值,我可以看出为什么会混淆。
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)