2016-05-30 2 views
1

Je voudrais savoir s'il y a une possibilité d'appliquer pyFFTW (wrapper autour FFTW) le vecteur d'entrée à préserver lors de transformation R2C avant.pyFFTW permet de préserver le tableau d'entrée

Au moins dans FFTW d'origine le FFTW_PRESERVE_INPUT semble être une option par défaut (regardez les drapeaux de restriction de l'algorithme ici: http://www.fftw.org/doc/Planner-Flags.html)

Avec FFTW .__ appel pyFFTW __() on peut passer plusieurs drapeaux , mais seulement « FFTW_DESTROY_INPUT » est répertorié ici: http://hgomersall.github.io/pyFFTW/pyfftw/pyfftw.html#pyfftw.FFTW

Probablement, c'est non seulement défaillance dans la documentation parce que dans le code source, dans le fichier constructeurs/builders.py il y a un peu terrifiant déclaration (ligne 166):

overwrite_input: Que ce soit ou non le tableau d'entrée peuvent être écrasés lors de la transformation.

De plus dans le code dans le fichier constructeurs/_utils.py dans la définition d'une fonction _Xfftn, seul Destory drapeau est présent: if overwrite_input: flags.append('FFTW_DESTROY_INPUT')

La question ultime est: sachant que le FFTW_PRESERVE_INPUT ne peut pas être passé avec pyFFTW, pourrais-je au moins compter sur le fait que dans l'original FFTW cet indicateur FFTW_PRESERVE_INPUT est par défaut? Rappelez-vous le commentaire cité ci-dessus: "Si oui ou non le tableau d'entrée peut être remplacé" Les auteurs de l'enveloppe pyFFTW en savent-ils plus et le défaut FFTW_PRESERVE_INPUT ne fonctionnera pas?

$ rpm -q fftw fftw-3.3.4-6.fc23.x86_64

>>> pyfftw.__version__ '0.10.1

+0

Le génie même de la FFT standard est qu'il s'agit d'une opération in situ, donc elle écrase toujours l'entrée. Si vous voulez conserver l'entrée, gardez une copie de celle-ci. – roadrunner66

+0

@ roadrunner66 Ici http://www.fftw.org/doc/Planner-Flags.html les auteurs de FFTW ont permis 2 args. à passer: DESTROY_INPUT & PRESERVE_INPUT. Ils l'ont fait pour quelque chose et ma question est vraiment: «puis-je me fier à l'hypothèse que PRESERVE est par défaut? –

+0

@ roadrunner66 Je demande de préserver l'entrée, car je dois effectuer de nombreuses transformations directes sur des vecteurs très similaires, donc au lieu de configurer chaque vecteur d'entrée de zéro, je préférerais appliquer de minuscules changements au vecteur d'entrée unique. –

Répondre

1

Oui, tous les paramètres par défaut sont utilisés, sauf demande explicite - cela signifie que si vous demandez DESTROY_INPUT, alors PRESERVE_INPUT est implicite, sauf dans le cas où vous avez un multi -dimensional c2r transform, auquel cas l'entrée sera détruite (ceci est documenté dans la section Schemes de la documentation à laquelle vous avez lié, ainsi que les documents FFTW auxquels vous avez lié).

Si vous trouvez un cas où l'entrée est détruite et qu'elle n'est pas explicitement demandée en tant que telle ou n'est pas l'une des transformations ci-dessus, ceci est un bug et doit être signalé.

Le code interfaces fait diverses copies pour s'assurer que les transformations sont conservées lorsque cela est nécessaire. Mon souvenir est que la phase de planification est beaucoup plus lâche sur la protection des tableaux - la façon la plus simple de protéger la matrice est d'utiliser l'interface builders qui, sauf indication contraire explicite, stockera toujours le tableau original et le recopiera.

+0

Merci beaucoup, cela explique tout. Quand je posais cette question, je pensais qu'il y avait un problème sur le côté de la FFTW originale (pas pyFFTW) et c'est pourquoi vous utilisez ce 'reload_after_transform' dans les interfaces. De plus, vous avez autorisé un seul drapeau * DESTROY * omettant * PRESERVE * et s'il n'y en avait pas assez dans le commentaire, vous avez indiqué * Si le tableau d'entrée peut être écrasé *, ce qui m'a convaincu que les paramètres par défaut ne fonctionneraient pas. Heureusement, ce n'était qu'un malentendu. Encore une fois, merci pour cette réponse et généralement pour la création de wrapper * pyFFTW *. –