【发布时间】:2021-07-19 23:28:07
【问题描述】:
这段代码的 sn-p 读入一些未格式化的双精度数据,并在其上返回一个真正的 FFTW:
#include <stdio.h>
#include <fftw3.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int i, fdin;
int count=128;
static fftw_plan fplan=0;
double alldata[2][count];
fdin = open("rand_walk.dat", O_RDONLY);
read(fdin, alldata[0], sizeof(double)*count);
fplan = fftw_plan_r2r_1d(count, alldata[0],
alldata[1], FFTW_R2HC, FFTW_ESTIMATE);
fftw_execute_r2r(fplan, alldata[0], alldata[1]);
printf("%lf\n",alldata[0][0]);
printf("%lf\n",alldata[1][10]);
return 0;
}
在 GNU 或 Cray 下编译时它工作得很好。在 Intel 下编译时,它运行时没有任何错误消息,但输出数组 (alldata[1]) 用零填充。显然,我不明白英特尔与 FFTW3 的关系。有谁知道那可能是什么?顺便说一句,在我必须使用的平台上切换到 FFTW2 不是一个选项。
【问题讨论】:
-
请从正确的错误处理开始。您确定输入文件已正确打开吗?你永远不会检查它。
-
@EugeneSh。正如我经常被要求的那样,我正试图使显示的代码尽可能短。 FWIW,我已经测试过,文件打开并正确读取。
-
这很好,但您应该确保呈现的代码没有引入原始代码没有的问题。不幸的是,我们不能“相信”代码中没有明确存在的东西,它不是个人的,而是基于许多其他问题的经验。这也应该是minimal reproducible example,也就是说,如果您声称 (
alldata[1]) 用零填充,那么请显示显示该数组全为零的代码。 -
举个简单的例子,只需硬编码一个数组。非零输入必须有非零输出很简单,因此只需设置
alldata[0][0] = 1.0;就足够了。