#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)
Документация:
- http://docs.julialang.org/en/release-0.5/stdlib/arrays/#Base.view
- http://docs.julialang.org/en/release-0.5/devdocs/subarrays/
Редактировать: добавлен макрос @view благодаря комментарию Саймона ниже.
Комментарии:
1. Вы также можете использовать
@view
макрос:ifft!(@view(buf_FFT[:,1]), 1)