FFTW实数到实数变换跨步阵列

Ale*_*tof 9 c arrays matrix fftw

我有一个以行主顺序存储的矩阵.我正在尝试使用FFTW计算ub矩阵的DCT,我得到了无意义.在下面的段落中,我将描述问题和我的解决方案,我希望你帮助理解为什么它不起作用.

鉴于一些il,我想计算一个子矩阵包括所有行的DCT k为此k mod l == i.例如,假设l = 3i = 2.在下面的矩阵中,我希望变换的子矩阵用红色标记(2 mod 3 = 2,5 mod 3 = 2,8 mod 3 = 2).

矩阵

源和目标数组具有相同的布局,转换后的矩阵应存储在目标数组中的相同位置.

void transform(double* src, double* dest, size_t rows, size_t cols, size_t l, size_t i)
{
    int rank = 2;
    fftw_iodim64 dims[] = {
        { rows / l, l, l },
        { cols, rows, rows } };
    fftw_r2r_kind kind = FFTW_REDFT10;

    fftw_plan plan = fftw_plan_guru64_r2r(rank, dims, 0, NULL, src + l, dest + l, &kind, FFTW_ESTIMATE | FFTW_UNALIGNED | FFTW_PRESERVE_INPUT);
    fftw_execute(plan);
    fftw_destroy_plan(pla);
}
Run Code Online (Sandbox Code Playgroud)

更新

我测试了它的简单情况i=l=1.即使在那种情况下,我也会胡说八道.我使用3x4矩阵进行测试,该矩阵恰好是DCT基矢量之一:

A(i,j) = cos((i + 0.5)*2*pi/3) * cos((j + 0.5)*3*pi/4)
Run Code Online (Sandbox Code Playgroud)

我希望得到一个结果,其中所有元素都是(接近)零,除了一个.但是我得到了一个如下所示的结果矩阵:

0             -2.22045e-016  1.33227e-015  2.22045e-016
2.22045e-016  -2.77556e-016  9.99201e-016  5.55112e-017
-8.88178e-016 -1.62359       7.83938       1.62359
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪.

更新2

我还测试了一个简单的矩阵,其中(0,0)元素为1,其余为零.在这种情况下,i=l=1(子矩阵也是整个矩阵).结果如下:

      2       2       2       0
1.73205 1.73205 1.73205       0
      1       1       1       0
Run Code Online (Sandbox Code Playgroud)