特征样条插值 - 如何在仲裁点x处获得样条y值?

时间:2015-04-23 11:25:50

标签: c++ spline eigen3

我尝试使用Eigen库来创建样条线。但是,一旦我创建样条曲线,我就不知道如何获得给定点x的值。

请参阅下面的示例并解释我的意图:

#include <Eigen/Core>
#include <unsupported/Eigen/Splines>

int main(int argc, char const* argv[])
{
    // points at (0,0) (15,12) and (30,17)
    Eigen::MatrixXd points(2, 3);
    points << 0, 15, 30,
              0, 12, 17;

    typedef Eigen::Spline<double, 2> spline2d;
    spline2d s = Eigen::SplineFitting<spline2d>::Interpolate(points, 2);

    // I now have a spline called s.
    // I want to do something like:
    double x = 12.34;
    double new_y = s(x)[1];  // However this s() function uses a chord value. What is a chord value?

    // Is there a:
    double new_y2 = s.eval(x)
}

2 个答案:

答案 0 :(得分:10)

我看到这可能会令人困惑。当您使用时,本征样条拟合模块不对函数R - >建模。例如,你可以用它构建一个螺旋线。这意味着您不能期望从X值获得Y值,而是在样条曲线上选择它们沿着样条曲线的距离(因此是弦长)。

可以使用模块对函数建模,虽然不是非常直观:考虑你在R 1 中的Y值点,而不是让Eigen计算弦长,提供你自己的集合与X值间隔开的结参数(按比例缩小为[0,1],以便算法可以应对)。它可以打包这样的东西:

myView.setVisibility(View.VISIBLE);

答案 1 :(得分:1)

@Wintermute解决方案适用于小向量。但是,如果向量太大,则会非常慢并且会消耗大量RAM。

 Eigen::VectorXd xvals = Eigen::VectorXd::LinSpaced(10000,0.,1);
 Eigen::VectorXd yvals = xvals.array().sin(); 
        
 SplineFunction s(xvals, yvals);

 std::cout << s(0.50000001) << std::endl;

需要〜2 GB RAM,并且在我的系统上需要17秒(使用了16个线程)

为了比较,我使用了gsl

gsl_interp_accel* accel_ptr = gsl_interp_accel_alloc();
gsl_spline* spline_ptr;

spline_ptr = gsl_spline_alloc(  gsl_interp_cspline, 10000 );
gsl_spline_init( spline_ptr, &xvals[0], &yvals[0], 10000 );

std::cout << gsl_spline_eval( spline_ptr, 0.50000001, accel_ptr ) << std::endl;

gsl_spline_free( spline_ptr );
gsl_interp_accel_free( accel_ptr );

这需要几微秒,并且需要很少的RAM