2015-07-30 2 views
9

У меня есть матрица, хранящаяся в строчном порядке. Я пытаюсь вычислить DCT ub-матрицы с использованием FFTW, и я получаю ерунду. В следующих параграфах я расскажу о проблеме и моем решении, и я хотел бы, чтобы ваша помощь поняла, почему она не работает.FFTW real-to-real transform strided array

Учитывая некоторые i и l, я хотел бы вычислить DCT из суб-матрицы, которая состоит из всех строк, для которых kk mod l == i. Например, предположим, что l = 3 и i = 2. В следующей матрице субматрица, которую я хочу преобразовать, отмечена красным цветом (2 mod 3 = 2, 5 mod 3 = 2, 8 mod 3 = 2).

Matrix

источника и приемника массивы имеют одинаковую структуру, и трансформировали матрица должна быть сохранена в том же месте в целевом массиве.

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); 
} 

Update

Я проверил это для простого случая, когда i=l=1. Даже в этом случае я получаю ерунду. Я тестировал с матрицей 3х4, которая в точности один из базисных векторов ДКПА:

A(i,j) = cos((i + 0.5)*2*pi/3) * cos((j + 0.5)*3*pi/4) 

я ожидал, чтобы получить результат, где все элементы (близко к) равен нулю, за исключением одного. Но я получаю результирующую матрицу, которая выглядит так:

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 

Кажется довольно странным.

Обновление 2

я также тестировали с помощью простой матрицы, где элемент (0,0) равно 1, а остальные равны нулю. В этом случае также i=l=1 (подматрица представляет собой всю матрицу). Вот результат:

 2  2  2  0 
1.73205 1.73205 1.73205  0 
     1  1  1  0 
+0

Можете ли вы протестировать с помощью некоторого очевидного ввода (простые шаблоны из 1s и 0s) и посмотреть, какой результат вы получите? Может быть, разместите его здесь, чтобы можно было понять, что происходит не так? –

+0

Я сделал что-то еще. Я заполнил подматрицу одним из базовых векторов DCT. То, что я получаю, это то, что * не * все нули, за исключением одного ненулевого элемента. Я получаю много ненулевых элементов в результате. – Alex

+0

Вы нигде не указали, что ваш шаг ввода составляет 2 * строки. –

ответ

Смежные вопросы