我有以下代码:
auto in = std::array<std::complex<float>, 60>();
in[0] = 10000.0f;
auto out = std::array<float, 100>();
auto plan = fftwf_plan_dft_c2r_2d(10, 10, reinterpret_cast<fftwf_complex*>(in.data()), out.data(), FFTW_ESTIMATE | FFTW_UNALIGNED);
fftwf_execute_dft_c2r(plan, reinterpret_cast<fftwf_complex*>(in.data()), out.data());
当我运行它时,我的in
数组被写入(特别是第一列设置为10000.0)。这是正常的吗?我可以避免编写in
数组吗?
答案 0 :(得分:2)
正如documentation中所述,使用c2r
转换时输入数据将被覆盖
其次,逆变换(复数到实数)具有副作用 默认情况下,覆盖其输入数组。这些都不是 不便之处应该给用户带来严重的问题,但确实如此 重要的是要了解它们。
如上所述,
FFTW_PRESERVE_INPUT
变换甚至会破坏其输入数组 不合适的变换。如有必要,可以通过以下方式防止这种情况 不幸的是,在旗帜中包括FFTW_PRESERVE_INPUT
牺牲表现。目前还不支持此标志 用于多维真实DFT(下一节)。
因此,即使使用FFTW_PRESERVE_INPUT
,在这种情况下它也不起作用。来自FFTW_PRESERVE_INPUT
documentation
c2r
指定不能进行异地转换 更改其输入数组。这通常是默认值,hc2r
除外 和FFTW_DESTROY_INPUT
(即复数到实数)变换FFTW_PRESERVE_INPUT
是默认值。在后一种情况下,通过c2r
将尝试使用不会破坏的算法 输入,代价是性能较差;用于多维 但是,NULL
转换没有输入保留算法 如果有人请求,计划员将返回function SearchByColor { param ([string]$color) $result = for ($i = 0; $i -lt $resultbox.TextLength; $i++) { $resultbox.Select($i, 1) if ($resultbox.SelectionColor.Name -eq $color) { $resultbox.SelectedText } } $result -join '' }
。
因此,解决这个问题的简单方法就是在将输入数组传递给计划函数之前复制它。