FFTW:fftw_plan_r2r()的种类参数

时间:2014-05-28 17:34:51

标签: c++ fftw

我正在尝试用FFTW进行多维真实变换。根据{{​​3}},函数定义如下:

fftw_plan fftw_plan_r2r(int rank,
                        const int *n,
                        double *in,
                        double *out,
                        const fftw_r2r_kind *kind,
                        unsigned flags);

此外,关于第五个论点:

  

每个维度都有一个类型参数,类型为fftw_r2r_kind,指定   那种用于该维度的r2r变换。 (在这种情况下   fftw_plan_r2r,这是一种数组[rank],其中kind [i]是   变换为维度n [i]的种类。)种类可以是一组中的一种   预定义常量的定义,在以下小节中定义。

我在分配种类阵列时遇到了麻烦。以下是我尝试过的一些事情:

这给了我一个“只读变量不可分配”的错误:

const fftw_r2r_kind *kind;
kind = (fftw_r2r_kind*) fftw_malloc(sizeof(fftw_r2r_kind) * 2);
kind[0] = FFTW_REDFT11;
kind[1] = FFTW_REDFT11;
p = fftw_plan_r2r(WorkImageType::ImageDimension, n, in, out, kind, FFTW_ESTIMATE);

这给了我一个“意外的表达”错误:

const fftw_r2r_kind *kind;
kind = (fftw_r2r_kind*) fftw_malloc(sizeof(fftw_r2r_kind) * 2);
kind[0] = FFTW_REDFT11;
kind[1] = FFTW_REDFT11;
p = fftw_plan_r2r(WorkImageType::ImageDimension, n, in, out, kind, FFTW_ESTIMATE);

这给了我一个奇怪的“无法用'fftw_r2r_kind_do_not_use_me'类型的右值初始化'const fftw_r2r_kind *'(又名'const fftw_r2r_kind_do_not_use_me *')类型的数组元素”错误:

const fftw_r2r_kind *kind[2] = {FFTW_REDFT11, FFTW_REDFT11};
p = fftw_plan_r2r(WorkImageType::ImageDimension, n, in, out, kind, FFTW_ESTIMATE);

我是C ++和FFTW的新手,我很难过 - 我真的很感激任何建议!

1 个答案:

答案 0 :(得分:2)

您看到的错误是由于尝试为const变量赋值并混淆指针/数组而导致的。

在前两种情况下,您声明:

const fftw_r2r_kind *kind;

这是指向const fftw_r2r_kind对象(或其数组中的第一个)的(非常量)指针。然后分配内存并将指针存储在此变量中,这很好。但是,由于您告诉编译器这些对象是const,因此尝试为它们赋值将失败。

请注意,const fftw_r2r_kind *kind定义中的fftw_plan_r2r()位并不意味着您必须以相同的方式声明最终传递给它的变量。函数声明中的const是一个承诺,即该函数不会触及传入的值,而不是要求值在该函数之外实际为const(尽管它们可以是)。

在上一个示例中,错误源于您声明:

const fftw_r2r_kind *kind[2] = { ... };

这是一个指向const fftw_r2r_kind的两个指针数组的声明,而不是两个const fftw_r2r_kind的数组。然后尝试使用两个非指针值初始化数组。在这种情况下,由于您声明了数组本身,而不是指向保存对动态分配数组的引用的指针,因此它应该只是const fftw_r2r_kind kind[2] = { ... };。这应该允许您在声明时正确初始化数组,这是在const数组中设置值的正确方法。