如何在Julia中对阵列的子集进行就地FFT?

时间:2016-10-09 21:18:58

标签: julia

我有一个2D数组。我想在一列上运行(反向)就地FFT。以下内容不会对数据产生任何变化:

ifft!( buf_FFT[:,ind_page], 1 )

以下按预期方式工作:

buf_FFT[:,ind_page] = ifft( buf_FFT[:,ind_page] )

答案可能很明显,但我是朱莉娅的新手,在搜索中找不到答案。我假设第一个版本不起作用,因为当我指定数组的子集时,Julia实际上制作了一个副本。该副本被操作但随后被丢弃。在第二个版本中,副本将被复制回原始数组。它是否正确?就地访问数组子集的正确方法是什么?

请帮忙。谢谢!

1 个答案:

答案 0 :(得分:5)

正如您所猜测的那样,获取一个数组会创建一个副本。就地ifft!函数在此副本上运行,因此不会影响原始数组。要在就地切片上操作,您应该明确创建视图。有许多方法可以创建视图,如下面的代码所示(在v0.5上)。选择适合您上下文的一个。

buf_FFT = rand(Complex{Float64}, 10,10)
#in-place FFT on the first column of the matrix
ifft!( view(buf_FFT, 1:size(buf_FFT, 1),1), 1 ) 
#alternately, to save some typing:
ifft!( view(buf_FFT, Colon(), 1), 1 )
#Or, even simpler, use the @view macro
ifft!(@view(buf_FFT[:,1]), 1)

文档:

编辑:感谢Simon的评论,下面是@view宏。