【问题标题】:Does pyFFTW allow to preserve the input arraypyFFTW 是否允许保留输入数组
【发布时间】:2016-05-30 16:11:19
【问题描述】:

我想知道是否有可能在正向 r2c 变换期间强制 pyFFTW(FFTW 的包装器)要保留的输入向量

至少在 原始 FFTW 中,FFTW_PRESERVE_INPUT 似乎是一个默认选项(在此处查看算法限制标志:http://www.fftw.org/doc/Planner-Flags.html

使用 pyFFTW 的 FFTW.__call__() 可以传递多个标志,但此处仅列出 'FFTW_DESTROY_INPUT'http://hgomersall.github.io/pyFFTW/pyfftw/pyfftw.html#pyfftw.FFTW

这可能不仅是文档中的失误,因为在源代码中,在文件 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

【问题讨论】:

  • 标准 FFT 的天才之处在于它是一种就地操作,因此它总是会覆盖输入。如果您想保留输入,请保留一份副本。
  • @roadrunner66 这里fftw.org/doc/Planner-Flags.html FFTW 的作者允许使用 2 个参数。要通过:DESTROY_INPUT & PRESERVE_INPUT。他们这样做是出于某种原因,而我的问题确实是“我可以依赖 PRESERVE 是默认设置的假设吗?”。
  • @roadrunner66 我问的是保留输入,因为我必须对非常相似的向量执行许多正向变换,因此我宁愿对单个向量进行微小的更改,而不是从头开始设置每个输入向量输入向量。
  • 然后将该单个输入向量放入一个变量中,然后在将该副本提交到 FFT 之前对该副本应用微小的更改。
  • overwrite_input 是您对pyFFTW 的指示,让库知道覆盖输入是可以的。我不明白那个论点的问题?

标签: python python-3.x fft fftw pyfftw


【解决方案1】:

是的,除非明确请求,否则使用所有默认值 - 这意味着除非您请求 DESTROY_INPUT,否则 PRESERVE_INPUT 是隐式的,除了在您拥有多维 c2r 的情况下转换,在这种情况下,输入将被销毁(这记录在您链接到的文档的 Schemes 部分以及您链接到的 FFTW 文档中)。

如果您发现输入被破坏并且没有明确请求或者不是上述转换之一的情况,这是一个错误,应该报告。

interfaces 代码会制作各种副本,以确保在必要时保留转换。

我的回忆是,保护数组的计划阶段要宽松得多 - 保护数组的最简单方法是使用 builders 接口,除非另有明确建议,否则它将始终存储原始数组并将其复制回。

【讨论】:

  • 非常感谢,这解释了一切。当我发布这个问题时,我认为原始 FFTW(不是 pyFFTW)方面存在问题,这就是您在接口中使用此 reload_after_transform 的原因。此外,您只允许一个标志 DESTROY 省略 PRESERVE 并且如果您说的评论不够*输入数组是否可以被覆盖*,所有这些都说服了我该默认设置将不起作用。幸好,那只是误会。再次感谢您的回答,通常用于创建 pyFFTW 包装器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多