我有一个复数的向量(可以找到here),在Python和MATLAB中都有。我正在使用
计算ifft
- 转换
ifft(<vector>)
在MATLAB中和
np.fft.ifft(<vector>)
在Python中。我的问题是,我得到两个完全不同的结果,即虽然Python中的向量很复杂,但它不在MATLAB中。虽然MATLAB中的一些组件为零,但Python中没有组件。这是为什么? fft
- 版本按预期工作。最小值约为1e-10
,即不会太低。
答案 0 :(得分:7)
实际上,它们是相同的,但Python正在以极高的精度显示虚部。假想的组件显示的值大约为NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:jsonData];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor
responseDescriptorWithMapping: [LoginResponse getResponseMapping]
method:RKRequestMethodPOST
pathPattern:nil
keyPath:@"OutputParameters"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc]initWithRequest:request responseDescriptors:@[responseDescriptor]];
。
以下是我在MATLAB中重建问题所写的内容:
10^{-12}
format long g;
data = importdata('data.txt');
out = ifft(data);
是一个格式化选项,可显示更多有效数字,其中我们显示15位有效数字,包括小数位。
当我显示逆FFT输出的前10个元素时,这就是我得到的:
format long g;
对于>> out(1:10)
ans =
-6.08077329443768
-5.90538963023573
-5.72145198564976
-5.53037208039314
-5.33360059559345
-5.13261402212083
-4.92890104744583
-4.72394865937531
-4.51922820694745
-4.31618153490126
,请注意,使用numpy
字母而不是j
来读取复数。因此,当您加载文字时,必须将所有i
个字符转换为i
。完成后,您可以正常加载数据:
j
当您打开文件时,对In [15]: import numpy as np
In [16]: with open('data.txt', 'r') as f:
....: lines = map(lambda x: x.replace('i', 'j'), f)
....: data = np.loadtxt(lines, dtype=np.complex)
的调用将获取文件的内容并将每个map
字符转换为i
并返回每个元素的字符串列表此列表中的复数是您的文本文件中的j
替换为i
。然后,我们将调用j
函数将这些字符串转换为复数数组。
现在当我拿着IFFT并显示反转结果的前10个元素时,我们看到了MATLAB版本,我们得到:
numpy.loadtxt
正如你所看到的那样,真实部分是相同的,但虚部仍然存在。但是,请注意虚部的幅度有多小。在这种情况下,MATLAB选择不显示虚部,因为它们的幅度非常小。实际上,从MATLAB中的In [20]: out = np.fft.ifft(data)
In [21]: out[:10]
Out[21]:
array([-6.08077329 +0.00000000e+00j, -5.90538963 +8.25472974e-12j,
-5.72145199 +3.56159535e-12j, -5.53037208 -1.21875843e-11j,
-5.33360060 +1.77529105e-11j, -5.13261402 -1.58326676e-11j,
-4.92890105 -6.13731196e-12j, -4.72394866 +5.46673985e-12j,
-4.51922821 -2.59774424e-11j, -4.31618154 -1.77484689e-11j])
调用返回的数据类型是真实的,所以在调用ifft
之后可能会有一些后处理来丢弃这些虚构的组件。顺便说一下,ifft
并没有做同样的事情,但你可能会认为这些组件非常小而且微不足道。
总而言之,Python和MATLAB中的numpy
调用基本相同,但虚构的组件在Python / ifft
返回那些虚构组件的意义上是不同的,即使它们是无关紧要的MATLAB中的numpy
调用没有。另请注意,您需要确保将虚构变量替换为ifft
,并且不能像您提供的原始文本文件那样使用j
。如果你知道某些输出类型应该是真实的,那么你也可以通过在i
结果上调用numpy.real
来删除虚构的组件。