Mam macierz zapisaną w rzędzie-większej kolejności. Próbuję obliczyć DCT ub-macierzy za pomocą FFTW, i mam nonsens. W poniższych akapitach opiszę problem i moje rozwiązanie, a ja chciałbym, abyś pomógł ci zrozumieć, dlaczego to nie działa.Transmitowana macierz FFTW z rzeczywistą transformacją
względu niektóre i
i l
, ja jak obliczyć DCT o sub-matrycy, która składa się ze wszystkich rzędach k
dla których k mod l == i
. Załóżmy na przykład, że l = 3
i i = 2
. W poniższej macierzy pod-macierz, którą chcę przekształcić zaznaczono na czerwono (2 mod 3 = 2, 5 mod 3 = 2, 8 mod 3 = 2).
źródłowym i docelowym macierze mają ten sam układ, oraz przekształcony matrycy powinna być zapisana w tym samym miejscu w tablicy docelowej.
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);
}
Aktualizacja
ja testowałem to na prostym przypadku gdy i=l=1
. Nawet w takim przypadku mam nonsens. Testowałem z matrycą 3x4, która jest dokładnie jeden z wektorów bazowych DCT:
A(i,j) = cos((i + 0.5)*2*pi/3) * cos((j + 0.5)*3*pi/4)
Spodziewałem się uzyskać wynik, gdzie wszystkie elementy są (prawie) zerowa wyjątkiem jednego. Ale otrzymuję wynikową macierz, która wygląda następująco:
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
Wydaje się dość dziwne.
Aktualizacja 2
również badane w prosty matrycy, gdzie (0,0) elementu wynosi 1, a pozostałe to zero. W tym przypadku też, i=l=1
(pod-macierz jest całą macierzą). Oto wynik:
2 2 2 0
1.73205 1.73205 1.73205 0
1 1 1 0
Czy możesz przetestować niektóre oczywiste dane wejściowe (proste wzorce 1 i 0) i zobaczyć, jakie dane wyjściowe otrzymasz? Może opublikuj to tutaj, aby ktoś wpadł na pomysł, co jest nie tak? –
Zrobiłem coś innego. Napełniłem pod-macierz jednym z wektorów bazowych DCT. Otrzymuję coś, co jest * nie * zerami, z wyjątkiem pojedynczego niezerowego elementu. Otrzymuję wiele niezerowych elementów w wyniku. – Alex
Nie określasz nigdzie, że twój krok wejściowy wynosi 2 * wiersze. –