使用fftw与列主要方形矩阵(犰狳库)

时间:2014-03-06 10:11:45

标签: c++ matrix fft fftw armadillo

我发现armadillo C ++库非常便于矩阵计算。如何使用FFTW库对犰狳矩阵执行二维FFT?

据我所知,犰狳矩阵类以列主要顺序存储数据。如何将其传递给FFTW? fftw 3.3.3文档说

  

如果你有一个以列主要顺序存储的数组,并希望使用FFTW对其进行转换,那么很容易做到。创建计划时,只需以相反的顺序将数组的维度传递给计划程序。例如,如果您的数组是按列大顺序排列的三级N x M x L矩阵,则应该将数组的维度传递为L x M x N矩阵(从它的角度来看,它是FFTW)

我无法完全理解这意味着什么,因为创建计划的语法如下。

fftw_plan fftw_plan_dft_2d(int n0, int n1,
                            fftw_complex *in, fftw_complex *out,
                            int sign, unsigned flags);

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:5)

这只意味着你可以尝试两种

  fftw_plan plan=fftw_plan_dft_2d(4, 2,(double(*)[2])&AAA(0,0), (double(*)[2])&BBB(0,0), FFTW_FORWARD, FFTW_ESTIMATE);

 fftw_plan plan=fftw_plan_dft_2d(2, 4,(double(*)[2])&AAA(0,0), (double(*)[2])&BBB(0,0), FFTW_FORWARD, FFTW_ESTIMATE);

并保持正确的顺序。

通常,inout将由fftw_malloc()分配以保持对齐的内存。 很少的测试表明,犰狳的cx_mat矩阵已经是这种情况(没有可怕的分段错误或错误的值......)。

这是测试代码(以及正确的顺序......):

    #include <iostream>
#include <fftw3.h>
#include "armadillo"

using namespace arma;
using namespace std;


int main(int argc, char** argv)
{
    cout << "Armadillo version: " << arma_version::as_string() << endl;


    cx_mat AAA = eye<cx_mat>(2,4);
    AAA(0,0)=0;
    AAA(0,1)=1;
    AAA(0,2)=2;
    AAA(0,3)=3;

    AAA(1,0)=0;
    AAA(1,1)=1;
    AAA(1,2)=2;
    AAA(1,3)=3;


    cx_mat BBB = eye<cx_mat>(2,4);

    fftw_plan plan=fftw_plan_dft_2d(4, 2,(double(*)[2])&AAA(0,0), (double(*)[2])&BBB(0,0), FFTW_FORWARD, FFTW_ESTIMATE);

    fftw_execute(plan);

    BBB.print("BBB:");
    return 0;
}

将其编译为g++ -O2 -o example1 example1.cpp -larmadillo -llapack -lblas -lfftw3

再见,

弗朗西斯