我正在使用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
数组的大小(所有六个数组的大小相同)。
我的问题:我是否真的需要为每个样条线单独加速?这种方式更快,跨多个样条线共享加速器是否安全?
答案 0 :(得分:1)
是的,每个样条曲线需要一个加速器,对于多个样条曲线中的相同加速器,它是安全的。正如您自己已经猜到的那样,加速器是一种预处理,在最好的情况下,在给定混合输入的情况下减慢插值。
如果您关注创建加速器的性能方面并经常释放它们,只需保留加速器并在每次使用后重置它们。
取决于二进制文件的大小以及影响内存查找的其他因素,性能的一大收获是在编译期间使用-DHAVE_INLINE=1
。它将从标题中内联gsl_interp_accel_find
,而不是使用libgsl
中的编译版本。