我无法让FFTW链接到我的代码,以便在我的代码中使用它的功能。我花了足够的时间来考虑放弃它。
我对GSL非常熟悉,并且广泛使用了线性代数库并取得了良好的效果。 GSL还有一组FFT函数,它们与FFTW的作用相同。它们一样好吗?或者FFTW明显更好,值得花更多的时间来尝试让它发挥作用?
(顺便说一下,我的错误是在我不是管理员的远程系统上使用g ++,我无法编译我的代码来识别对FFTW调用的引用。我的makefile包含-L / libdirectory -lfftw3但是我仍然得到一些(不是全部)fftw函数的未定义引用。
这是来源:
#include "fftw3.h"
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * length);
以下是相关的编译命令:
g++ -std=c++0x -fPIC ... -lm ... -L/libdirectory -lfftw3
这是错误:
/source.cc: undefined reference to 'fftw_malloc'
请注意,编译器能够找到fftw3.h。我也可以声明fftw_complex
和fftw_plan
等对象。
编辑:我仍然无法将我的Makefile链接到静态库。但是,我能够使用共享库重新编译,而这些库似乎已经工作到目前为止。我仍然希望看到一些比11岁更早的基准测试!
答案 0 :(得分:1)
你没有提到你会认为“显着更好”的东西,这可能意味着从速度,准确性,易用性,维护,许可等各种事情。但我认为你主要对速度和准确性比较感兴趣
对于速度方面,GNU GSL documentation的参考部分提及:
对于大规模FFT工作,我们建议使用Frigo和Johnson专用的FFTW库。 FFTW库是自我优化的 - 它会自动调整每个硬件平台的自身,以实现最高性能。
因此,根据GSL开发人员自己的承认,预计FFTW将超越GSL。多少钱?您可以查看this speed performance benchmark from FFTW,这表明GSL比FFTW慢约3-4倍。请注意,此基准测试尚未使用g++
(并且似乎没有另一个来自FFTW网站gcc
编译器的现成基准,包括GSL),很可能在与您不同的机器上,因此您自己的结果可能会有所不同。在精确度方面this accuracy benchmark from FFTW表明它们在大多数情况下具有相似的精度(FFTW稍微更精确)但GSL往往表现出真实数据和更大变换尺寸的精度降低。
为了完整起见,我将简要提及,就许可而言,它们都提供GNU GPL许可,但FFTW还提供非免费许可,对于GNU GPL许可的人来说可能会更好。有问题的。否则,为了易于使用和维护,它们都是积极开发的,并提供不同但同样复杂的API。因此,对于这些方面,一个库优先于另一个库可能基于FFT实现优点的其他因素。