In-place fft

Hi, I am using the FFTW.jl package. If I have a vector, say

x = rand(100)

How can I compute its discrete Fourier transform values in-place ? The command

fft(x)

returns a new array but leaves x intact.
This brings me to my second question, or comment, that often, these excellent libraries in Julia do not come with a documentation that lists the various functions, like in Java or Matlab. Does FFTW.jl have one such list ?

x = rand(100) is a real array, and fft(x) is complex, so you’re not going to do that operation in-place. If you have a complex array, you can do:

x = rand(ComplexF64, 100)
fft!(x)

or

p = plan_fft!(x)
... write some data into x ...
p * x
... write some other data into x ...
p * x

if you want to perform many in-place FFTs and want to perform the precomputations once.

There are specialized transforms in FFTW.jl for real data, but the rfft function isn’t currently available in-place (although there is a pending PR).

As the FFTW.jl manual says, most of its functions are implementing the AbstractFFTs.jl interface and are documented in the AbstractFFTs.jl manual.

1 Like

@stevengj Thank you very much for telling me about this function plan_fft! (). However, in your commands, if I am to use plan_fft!(x), then I think x is already changed, so I do not need to do the step
p * x.

The only reason for using plan_fft! is if you are going to perform many FFTs of the same array x (overwritten in-place with different data). If you only need a single FFT, then use fft!. But if you only need a single FFT, why are you bothering with in-place transforms in the first place?

If you use plan_fft or plan_fft! with the default FFTW.ESTIMATE flag, then it does not modify x. If you use it with plan_fft!(x, flags=FFTW.MEASURE) or plan_fft!(x, flags=FFTW.PATIENT) then it will overwrite x with zeros (it runs some benchmarks to find the best algorithm). See also the FFTW FAQ.

Hi @stevengj,
Thank you again for the great summary. Actually, I have a nXm matrix A of type Array{Float64,2}, and I want to replace it with columnwise fft.
Reason for me wanting to do this is that I am trying to save allocation space. n is usually very large for me, and in the program that I intend to call this routine, there are other huge matrices stored in the memory.
As you mentioned, it cannot be replaced in-place since it is a real valued matrix.