Fortran 使用FFTW的FFT多重1d变换
我有一个三维数组U(z,y,x),我想在z中对y和x的所有值进行复傅里叶变换。我计划使用FFTW图书馆。我从FFTW手册中了解到,有一种方法可以同时执行多个1d变换(如下所述) 调用dfftw_plan_many_dft(plan,rank,n,hown,in,inembed,istride,idist,out,onembed,ostride,odist,FFTW_度量) 我不太明白Fortran 使用FFTW的FFT多重1d变换,fortran,fft,fftw,Fortran,Fft,Fftw,我有一个三维数组U(z,y,x),我想在z中对y和x的所有值进行复傅里叶变换。我计划使用FFTW图书馆。我从FFTW手册中了解到,有一种方法可以同时执行多个1d变换(如下所述) 调用dfftw_plan_many_dft(plan,rank,n,hown,in,inembed,istride,idist,out,onembed,ostride,odist,FFTW_度量) 我不太明白inembed和outembed的意思。由于我是Fortran新手,不知道如何使用它,您能否对此提供更多的见解 E
inembed
和outembed
的意思。由于我是Fortran新手,不知道如何使用它,您能否对此提供更多的见解
EDIT1:更新了Fortran代码这里描述得非常好:
inembed
和outembed
允许将传入和传出数据嵌入到更大的数据集中:
假设您希望对O
元素表示的中的子矩阵进行FFT。并可能将结果输出到out
变量的O
字段中
X X X X X X X X X X X
X X X X X X O O X X X
in = X O O X X out = X O O X X X
X O O X X
X X X X X
inembed
则为[2,1](主列)和outembed
[1,1]。然后,stride会将您从一个切片带到另一个切片/从一个卷带到另一个卷等。使用stride
和embed
可以告诉FFTW,如何找到每个要转换的子数据的O
元素,以及如何将它们放在更大的数据集中
希望这能解释。如果您现在已经打开了BLAS接口,您会发现inembed
和outembed
对应于许多例程的LDA
,LDB
。当然,BLAS例程仅限于矩阵,即假设二维操作。当然,您可以在任意多个维度上进行FFT
如果将inembed
和outembed
设置为NULL
,则FFTW假设在两个输入和输出中都没有X
字段。是。我只是提供这一点作为参考。我现在将更新Fortran版本。我不明白[2,1]和[1,1]是如何从图中的矩阵开始的。[2,1]
在主列中意味着从第3行第2列开始。在row major中,[1,2]
当然,但您当时正在编写fortran,这就是我选择manjor列的原因。这是嵌入矩阵的左上角。我知道了,我从左下角开始计数。我的错。由于我最常用的应用程序,我总是想到带FFT的笛卡尔空间。在计算机上,一切都从左上角开始。这同样适用于mathematica和matlab,我知道。然而,物理空间并非如此。