首先介绍一下我的主要目的. 考虑一个未知的函数 f(x,y)=(f_1(x,y),f_2(x,y)),(x,y)\in\mathbb{R}^2,假设 f_1,f_2 关于两个变量都是1-周期的, 也就是说 f_i(x+1,y)=f_i(x,y+1)=f_i(x,y). 假设已知了这个向量函数在 [0,1]\times[0,1] 上的一个离散分布数据, 现在我需要计算这个函数的 Fourier 系数.
暂时我是这么考虑的. 假设这个未知函数为 f(x,y)=(\sin(2\pi x)\cos(2\pi y), \cos(2\pi x)\sin(2\pi y)), 首先很容易可以创建这个函数在 [0,1]\times[0,1] 上的离散数据.
function f(x)
[sin(2*pi*x[1])*cos(2*pi*x[2]), cos(2*pi*x[1])*sin(2*pi*x[2])]
end
N=200
data = [f([i/N,j/N]) for i in 0:N-1, j in 0:N-1]
数据 data
是一个 N\times N 的矩阵, 矩阵的每一个元素都是一个 2\times1 的矢量. 根据离散Fourier变换的定义, 可以通过离散Fourier变换和数据 data
来计算 f 的Fourier系数. Julia 实现离散Fourier变换的包是FFTW.jl, 但我不知道这个包能不能实现向量值函数的离散Fourier变换. 当然, 我可以写如下比较丑陋的代码: 将两个维度的数据拆分为两个矩阵, 分别进行离散Fourier变换, 再拼接一下, 代码如下
function v_fft(A::Matrix{Vector{Float64}})
n=size(A,2)
b=Matrix{Float64}(undef, n, n)
c=Matrix{Float64}(undef, n, n)
@inbounds @simd for i in 1:n^2
b[i]=A[i][1]
c[i]=A[i][2]
end
fb=fft(b)
fc=fft(c)
result=Matrix{Vector{ComplexF64}}(undef, n, n)
@inbounds @simd for i in 1:n^2
result[i]=[fb[i],fc[i]]
end
result
end
但如上所说, 这样写太丑陋了, 实际上应该并不需要这么做. 但是这个包的文档写得太简略了, 没有多少数学定义, 我看不太懂. 请问有没有大佬可以解决一下这个问题, 即不用这么麻烦的方式直接得到结果.