如何在Julia中对数组的子集进行原地FFT?

3
我有一个二维数组,想在其中一个列上运行原地(inverse)FFT。以下代码不会改变数据: ifft!(buf_FFT[:,ind_page], 1) 以下代码按预期工作: buf_FFT[:,ind_page] = ifft(buf_FFT[:,ind_page]) 答案可能很明显,但我对Julia还很陌生,搜索中找不到答案。我假设第一个版本不起作用是因为当我指定数组子集时,Julia实际上会复制一份。该副本将被操作,但随后会被丢弃。在第二个版本中,副本会被复制回原始数组。这是正确的吗?如何正确地就地访问数组子集?
请帮忙,谢谢!
1个回答

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宏,现已添加。


1
你也可以使用 @view 宏:ifft!(@view(buf_FFT[:,1]), 1) - Simon Byrne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接