У меня есть матрица, хранящаяся в строчном порядке. Я пытаюсь вычислить DCT ub-матрицы с использованием FFTW, и я получаю ерунду. В следующих параграфах я расскажу о проблеме и моем решении, и я хотел бы, чтобы ваша помощь поняла, почему она не работает.FFTW real-to-real transform strided array
Учитывая некоторые i
и l
, я хотел бы вычислить DCT из суб-матрицы, которая состоит из всех строк, для которых k
k mod l == i
. Например, предположим, что l = 3
и i = 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);
}
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
Можете ли вы протестировать с помощью некоторого очевидного ввода (простые шаблоны из 1s и 0s) и посмотреть, какой результат вы получите? Может быть, разместите его здесь, чтобы можно было понять, что происходит не так? –
Я сделал что-то еще. Я заполнил подматрицу одним из базовых векторов DCT. То, что я получаю, это то, что * не * все нули, за исключением одного ненулевого элемента. Я получаю много ненулевых элементов в результате. – Alex
Вы нигде не указали, что ваш шаг ввода составляет 2 * строки. –