我发现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);
有人可以解释一下吗?
答案 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);
并保持正确的顺序。
通常,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;
}
将其编译为g++ -O2 -o example1 example1.cpp -larmadillo -llapack -lblas -lfftw3
!
再见,
弗朗西斯