GSL:样条之间共享加速器
GSL: Sharing accelerators between splines
我正在使用 GSL 进行大量三次样条插值。假设我有三个自变量 a
、b
和 c
,所有这些变量都在相同的物理数据点上制表(它可能是以米、英尺和英里为单位测量的同一组位置),以及两个因变量 y
和 z
,列在相同的点。即,函数 y(a)
、y(b)
、y(c)
、z(a)
、z(b)
和 z(c)
的数据被制成表格。我现在为这些函数制作了 6 个三次样条,如下所示 y(a)
样条:
gsl_interp_accel *acc = gsl_interp_accel_alloc();
gsl_spline *spline = gsl_spline_alloc(gsl_interp_cspline, size);
gsl_spline_init(spline, a, y, size);
其中 size
是 a
和 y
数组的大小(所有六个数组的大小都相等)。
我的问题:我真的需要为每条样条曲线设置一个单独的加速器吗?这种方式是否更快,跨多个样条共享加速器是否安全?
是的,每个样条曲线都需要一个加速器,而且在多个样条曲线之间使用同一个加速器对您来说绝对不安全。正如您自己已经猜到的那样,我假设加速器是一种预处理,在最好的情况下会减慢给定混合输入的插值。
如果您担心创建加速器并经常释放它们的性能方面,只需保留加速器并在每次使用后重置它们。
编译期间使用 -DHAVE_INLINE=1
取决于二进制文件的大小和影响内存查找的其他因素,这对性能有很大的好处。它将从 header 内联 gsl_interp_accel_find
而不是使用 libgsl
中的编译版本。
我正在使用 GSL 进行大量三次样条插值。假设我有三个自变量 a
、b
和 c
,所有这些变量都在相同的物理数据点上制表(它可能是以米、英尺和英里为单位测量的同一组位置),以及两个因变量 y
和 z
,列在相同的点。即,函数 y(a)
、y(b)
、y(c)
、z(a)
、z(b)
和 z(c)
的数据被制成表格。我现在为这些函数制作了 6 个三次样条,如下所示 y(a)
样条:
gsl_interp_accel *acc = gsl_interp_accel_alloc();
gsl_spline *spline = gsl_spline_alloc(gsl_interp_cspline, size);
gsl_spline_init(spline, a, y, size);
其中 size
是 a
和 y
数组的大小(所有六个数组的大小都相等)。
我的问题:我真的需要为每条样条曲线设置一个单独的加速器吗?这种方式是否更快,跨多个样条共享加速器是否安全?
是的,每个样条曲线都需要一个加速器,而且在多个样条曲线之间使用同一个加速器对您来说绝对不安全。正如您自己已经猜到的那样,我假设加速器是一种预处理,在最好的情况下会减慢给定混合输入的插值。
如果您担心创建加速器并经常释放它们的性能方面,只需保留加速器并在每次使用后重置它们。
编译期间使用 -DHAVE_INLINE=1
取决于二进制文件的大小和影响内存查找的其他因素,这对性能有很大的好处。它将从 header 内联 gsl_interp_accel_find
而不是使用 libgsl
中的编译版本。