请帮我解决这个问题。 我试图通过使用FFTW3库在二维中使用快速傅里叶余弦变换。在我的情况下,我真的需要转换很多点。当我在x和y方向上设置的点数等于n0 * n1 = 512 * 512时,我的程序运行正常。但是,我设置的点数等于n0 * n1 = 1024 * 1024,我得到消息“分段错误”。问题可能来自内存,其中三个数组在[N],in2 [N],out [N](此处为N = n0 * n1)中是双重的,它们是构建的。
所以我试图用vector替换数组,但它似乎不适合FFTW3库。 我的程序是在RAM 4GB和核心i3的笔记本电脑上运行。
你能否就我的案件向我提出建议?
我很欣赏你的理想。 非常感谢你。
这是我的程序
enter code here
#include <stdio.h>
#include <math.h>
#include <fftw3.h>
using namespace std;
int main() {
int n0=1024;
int n1=1024;
int N=n0*n1;
double in[N], in2[N], out[N];
fftw_plan p, q;
int i,j;
p = fftw_plan_r2r_2d(n0,n1, in, out, FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE);
for (i =0;i <n0;i++){
for (j=0;j<n1;j++)
{
in[i*n0+j] = cos(2.0*M_PI*(double)i/(n0 - 1))+cos(2.0*M_PI*(double)j/(n1 - 1));
}
}
fftw_execute(p);
q = fftw_plan_r2r_2d(n0,n1, out, in2, FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE);
fftw_execute(q);
for (i =0;i<n0;i++){
for (j=0;j<n1;j++)
{
printf("%3d %9.5f %9.5f\n", i*n0+j, in[i*n0+j], in2[i*n0+j]/(2.0*(double)(n0 - 1))/(2.0*(double)(n1 - 1)));
}
}
fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup();
return 0;
}
答案 0 :(得分:0)
C ++标准禁止使用可变长度数组。有些编译器确实支持它们,但使用它们并不是一个好主意,因为它会使你的程序不可移植(即N
如果你创建一个大小为N
的数组,它必须是一个编译时常量在堆栈上。
in
,in2
和out
数组在堆栈上分配。默认堆栈大小因不同的操作系统而异,但通常为几兆字节(Linux上为8 MB)。持有它们是不够的。这就是你获得SEGFAULT的原因。
要解决此问题,您可以动态分配数组:
double* in = new double[N];
double* in2 = new double[N];
double* out = new double[N];
不要忘记在不再需要它们时(在本例程序的最后)删除它们以避免内存泄漏:
delete[] in;
delete[] in2;
delete[] out;
答案 1 :(得分:0)
FFTW3会很乐意接受来自矢量的点,你只需要得到一个指针。调用vector::data()
来获取指针。