Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB与Python中FFT线性代数的离散性_Python_Matlab_Fft - Fatal编程技术网

MATLAB与Python中FFT线性代数的离散性

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是实向量

堆栈溢出不支持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
是实向量时,我将在我的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)