当前位置: 首页 > 面试题库 >

Matlab和numpy / scipy中的FFT给出不同的结果

刘松
2023-03-14
问题内容

我正在尝试重新实现matlab工具箱之一。他们在那边使用fft。当我对相同的数据执行相同的操作时,我得到的结果与Matlab的结果不同。看看:

MATLAB

Msig =

 0     0     0     0
 0     0     0     0
 0     0     0     0
 0     0     0     0
 0     1     0     0
 0     0     0     0

fft(Msig.')

Columns 1 through 4

    0                  0                  0                  0          
    0                  0                  0                  0          
    0                  0                  0                  0          
    0                  0                  0                  0

Columns 5 through 6

 1.0000                  0          
      0 - 1.0000i        0          
-1.0000                  0          
      0 + 1.0000i        0

PYTHON

Msig=
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

np.fft.fft(Msig.transpose())
array([[ 0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j,
         0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j,
         0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j],
       [ 1.0 +0.00000000e+00j, -0.5 +8.66025404e-01j,
        -0.5 -8.66025404e-01j,  1.0 -3.88578059e-16j,
        -0.5 +8.66025404e-01j, -0.5 -8.66025404e-01j],
       [ 0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j,
         0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j,
         0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j],
       [ 0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j,
        0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j,
         0.0 +0.00000000e+00j,  0.0 +0.00000000e+00j]])

如果我弄乱了np.fft.fft()/ np.fft.fft2()/
np.fft.fftn()的参数(轴等),则可以得到的最佳值是相同的,但发生了变化。不幸的是,手动移位不是一种选择,因为Msig矩阵的大小和形状取决于输入参数。

您有任何解决办法的线索,可能是什么原因?


问题答案:

Matlab默认将fft应用到矩阵的列上,numpy默认将fft应用到最后一个轴(行)上。你要:

>>> np.fft.fft(Msig.T, axis=0)
array([[ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  1.+0.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.-1.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j, -1.+0.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+1.j,  0.+0.j]])

要么

>>> np.fft.fft(Msig).T
array([[ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  1.+0.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.-1.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j, -1.+0.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+1.j,  0.+0.j]])


 类似资料:
  • 问题内容: 我尝试将matlab代码转换为numpy,并发现numpy与std函数的结果不同。 在matlab中 在numpy中 这正常吗?我应该如何处理呢? 问题答案: NumPy函数采用一个可选参数:“自由度增量”。默认情况下是。对其进行设置以获取MATLAB结果: 要添加更多上下文,在计算方差(标准偏差为平方根)时,通常将其除以我们拥有的值的数量。 但是,如果我们从较大的分布中选择元素的随机

  • 在Python 2.7中我有两个矩阵:一个是密集的A_Dence,另一个是稀疏的A_Sparse。我对计算元素相乘和感兴趣。有两种方法:使用numpy的乘法或scipy稀疏乘法。我希望它们在执行时间上会给出完全相同的结果。但我发现,对于某些矩阵大小,它们给出了不同的结果。 产出: 如果我选择L=2001,那么输出是: 为了使用两种不同的乘法检查差异的大小依赖关系,我写道: 有人能帮我了解发生了什么

  • 问题内容: 我在Matlab中目前具有以下结构的数据 其中item是来自i = 1 .. n的单元格,每个单元格包含多个属性的数据结构,每个属性均具有大小为2,j的矩阵,其中j = 1 .. m。属性的数量不是固定的。 我必须将此数据结构转换为python,但是我对numpy和python列表并不陌生。用numpy / scipy在python中构造此数据的最佳方法是什么? 谢谢。 问题答案: 我

  • 问题内容: 我正在与试验KISSFFT在 C ++ 气馁使用后FFTPACK处理二维数组。 我编写了 逐个元素的乘法* 函数,将两个2D数组用转换后再相乘。然后,通过逆FFT函数将乘法结果转换回去。不幸的是,我在 C语言 中从 kissfft 获得的结果与我在 python中 通过 SciPy 获得的结果不同,如下图所示: * 为了测试乘法函数,在转换2D输入数组后,为简单起见,我将其与自身相乘。

  • 我怎样才能导入阶乘函数分别从Numpy和sippy为了看看哪一个更快? 我已经通过导入数学从python本身导入了阶乘。但是,它不适用于Numpy和smpy。

  • 我试图通过HTTP向服务器发送一个SHA256哈希字符串,在那里我想通过执行SHA256哈希并验证两个匹配来进行身份验证。出于测试目的,我使用相同的字符串,但是结果不匹配。这可能是我的base64_encode调用的默认编码方案吗?谢谢 在PHP中,我正在做: 我在做什么