Как мне выполнить БПФ на месте для подмножества массива в Julia?

#julia

#джулия

Вопрос:

У меня есть 2D-массив. Я хочу запустить (обратное) БПФ на месте для одного столбца. Следующее не приводит к изменению данных:

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

Следующее работает, как и ожидалось:

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

Ответ может быть очевидным, но я новичок в Julia и не смог найти ответ в поиске. Я предполагаю, что первая версия не работает, потому что, когда я указываю подмножество массива, Julia фактически создает копию. Эта копия обрабатывается, но затем отбрасывается. Во второй версии копия копируется обратно в исходный массив. Это правильно? Каков правильный способ доступа к подмножеству массива на месте?

Пожалуйста, помогите. Спасибо!

Ответ №1:

Как вы уже догадались, взятие фрагмента массива создает копию. 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)
  

Документация:

Редактировать: добавлен макрос @view благодаря комментарию Саймона ниже.

Комментарии:

1. Вы также можете использовать @view макрос: ifft!(@view(buf_FFT[:,1]), 1)