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)
有人可以解释一下吗?
这只意味着你可以尝试两者
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
!
再见,
弗朗西斯
归档时间: |
|
查看次数: |
1385 次 |
最近记录: |