У вас есть реальная функция A:
0 0 0 0
0 1.0000 2.0000 3.0000
0 2.0000 4.0000 6.0000
0 3.0000 6.0000 9.0000
Преобразование Фурье вещественной функции является эрмитовым. Это означает, что действительная часть спектра четна X(iw) = X(-iw)
, а мнимая часть спектра нечетна X(iw)=-X(-iw)
. Другими словами
imag(BBB) == -imag(BBB') && real(BBB) == real(BBB')
Но в этих условиях я знаю, что, например, только из коэффициентов на верхней диагонали я могу восстановить ВВВ для обратного преобразования.
fftw_plan_dft_r2c_2d
также объясняет, что именно поэтому CCC
должен быть равен nd / 2 + 1 x nd (1 столбец заполнения) для сохранения выходных данных. Таким образом, вы можете объявить CCC и CCCC следующим образом:
cx_mat CCC (4,3);
cx_mat CCCC(4,3);
Но так как вы упоминаете, что FFTW отличается от майора строк Armadillo, вы должны также отразить последствия этого в своем коде:
cx_mat CCC (3,4);
cx_mat CCCC(3,4);
И вдруг ваш результат выглядит совершенно иначе:
BBB:
(+3.600e+01,+0.000e+00) (-1.200e+01,+1.200e+01) (-1.200e+01,+0.000e+00) (-1.200e+01,-1.200e+01)
(-1.200e+01,+1.200e+01) (+0.000e+00,-8.000e+00) (+4.000e+00,-4.000e+00) (+8.000e+00,+0.000e+00)
(-1.200e+01,+0.000e+00) (+4.000e+00,-4.000e+00) (+4.000e+00,+0.000e+00) (+4.000e+00,+4.000e+00)
(-1.200e+01,-1.200e+01) (+8.000e+00,+0.000e+00) (+4.000e+00,+4.000e+00) (+0.000e+00,+8.000e+00)
CCC:
(+3.600e+01,+0.000e+00) (-1.200e+01,+1.200e+01) (-1.200e+01,+0.000e+00) (-1.200e+01,-1.200e+01)
(-1.200e+01,+1.200e+01) (+0.000e+00,-8.000e+00) (+4.000e+00,-4.000e+00) (+8.000e+00,+0.000e+00)
(-1.200e+01,+0.000e+00) (+4.000e+00,-4.000e+00) (+4.000e+00,+0.000e+00) (+4.000e+00,+4.000e+00)
IBB:
0 0 0 0
0 1.0000 2.0000 3.0000
0 2.0000 4.0000 6.0000
0 3.0000 6.0000 9.0000
ICC:
0 0 0 0
0 1.0000 2.0000 3.0000
0 2.0000 4.0000 6.0000
0 3.0000 6.0000 9.0000
Из того, что находится в CCC, вы можете восстановить оставшиеся коэффициенты, и ваше обратное преобразование будет правильным. Ударь меня, если что-то останется неясным.
Реконструкция может быть выполнена, например, следующим образом:
(+3.6e+01,+0.0e+00) (-1.2e+01,+1.2e+01) (-1.2e+01,+0.0e+00 (-1.2e+01,-1.2e+01)
(-1.2e+01,+1.2e+01) (+0.0e+00,-8.0e+00) (+4.0e+00,-4.0e+00 (+8.0e+00,+0.0e+00)
(-1.2e+01,+0.0e+00) (+4.0e+00,-4.0e+00) (+4.0e+00,+0.0e+00 (+4.0e+00,+4.0e+00)
conj(CCC(1,2)) conj(CCC(4,2)) conj(CCC(4,3)) conj(CCC(2,2))
И CCCC
завершено для обратного преобразования в реальное.