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

Jay*_*rya 4 c++ fft matrix fftw armadillo

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

据我所知,armadillo矩阵类以列主要顺序存储数据.如何将其传递给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);
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

fra*_*cis 5

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

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

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

并保持正确的顺序.

通常,in并且out将被分配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;
}
Run Code Online (Sandbox Code Playgroud)

编译它g++ -O2 -o example1 example1.cpp -larmadillo -llapack -lblas -lfftw3!

再见,

弗朗西斯