Позволяет ли pyFFTW сохранить входной массив
Я хотел бы знать, есть ли возможность принудительного применения pyFFTW (обертка вокруг FFTW) входного вектора, который будет сохранен во время прямого преобразования r2c.
По крайней мере, в оригинальном FFTW FFTW_PRESERVE_INPUT кажется опцией по умолчанию (посмотрите флаги ограничения алгоритма здесь: http://www.fftw.org/doc/Planner-Flags.html)
С вызовом pyFFTW FFTW.__ __() можно пройти несколько флагов, но здесь указан только "FFTW_DESTROY_INPUT": http://hgomersall.github.io/pyFFTW/pyfftw/pyfftw.html
Вероятно, это не только ошибка в документации, потому что в исходном коде в файле builders/builders.py есть немного пугающее утверждение (строка 166):
overwrite_input: может ли входной массив быть перезаписан во время преобразования.
Далее в коде в файле builders/_utils.py в определении функции _Xfftn присутствует только флаг Destory: if overwrite_input:
flags.append('FFTW_DESTROY_INPUT')
Главный вопрос: зная, что FFTW_PRESERVE_INPUT нельзя передать с помощью pyFFTW, могу ли я хотя бы полагаться на тот факт, что в оригинальном FFTW этот флаг FFTW_PRESERVE_INPUT установлен по умолчанию? Вспомните приведенный выше комментарий: "Может ли входной массив быть перезаписан?" Знают ли авторы обертки pyFFTW что-то еще, и FFTW_PRESERVE_INPUT по умолчанию не будет работать?
$ rpm -q fftw
fftw-3.3.4-6.fc23.x86_64
>>> pyfftw.__version__
'0.10.1
1 ответ
Да, все значения по умолчанию используются, если явно не запрошено - это означает, что если вы не запросите DESTROY_INPUT
, затем PRESERVE_INPUT
неявный, за исключением случая, когда у вас есть многомерное преобразование c2r, и в этом случае вход будет уничтожен (это задокументировано в Schemes
раздел документации, на которую вы ссылаетесь, а также документы FFTW, на которые вы ссылаетесь).
Если вы обнаружите случай, когда входные данные уничтожены, и они явно не запрашиваются как таковые или не являются одним из вышеперечисленных преобразований, это ошибка, о которой следует сообщить.
interfaces
Код делает различные копии, чтобы убедиться, что преобразования сохраняются при необходимости.
Насколько я помню, на стадии планирования гораздо менее важна защита массивов - самый простой способ защитить массив - это использовать builders
интерфейс, который, если явно не указано иное, всегда будет сохранять исходный массив и копировать его обратно.