C++ C++;:复制matlab';s interp1样条插值函数

C++ C++;:复制matlab';s interp1样条插值函数,c++,algorithm,matlab,interpolation,C++,Algorithm,Matlab,Interpolation,有没有人能给我一些关于使用样条插值复制MATLAB的interp1函数的指导?我试着在计算机上复制算法,但结果并不完全一致 #include <stdio.h> #include <stdint.h> #include <iostream> #include <vector> //MATLAB: interp1(x,test_array,query_points,'spline') int main(){ int size = 10;

有没有人能给我一些关于使用样条插值复制MATLAB的interp1函数的指导?我试着在计算机上复制算法,但结果并不完全一致

#include <stdio.h>
#include <stdint.h>

#include <iostream>
#include <vector>
//MATLAB: interp1(x,test_array,query_points,'spline')

int main(){

    int size = 10;

    std::vector<float> test_array(10);
    test_array[0] = test_array[4] = test_array[8] = 1;
    test_array[1] = test_array[3] = test_array[5] = test_array[7] = test_array[9] = 4;
    test_array[2] = test_array[6] = 7;

    std::vector<float> query_points;
    for (int i = 0; i < 10; i++)
        query_points.push_back(i +.05);

    int n = (size - 1);

    std::vector<float> a(n+1);
    std::vector<float> x(n+1);  //sample_points vector
    for (int i = 0; i < (n+1); i++){
        x[i] = i + 1.0;
        a[i] = test_array[i];
    }

    std::vector<float> b(n);
    std::vector<float> d(n);
    std::vector<float> h(n);
        for (int i = 0; i < (n); ++i)
            h[i] = x[i+1] - x[i];

    std::vector<float> alpha(n);
        for (int i = 1; i < n; ++i)
            alpha[i] = ((3 / h[i]) * (a[i+1] - a[i])) - ((3 / h[i-1]) * (a[i] - a[i-1]));

    std::vector<float> c(n+1);
    std::vector<float> l(n+1);
    std::vector<float> u(n+1);
    std::vector<float> z(n+1);

    l[0] = 1.0;
    u[0] = z[0] = 0.0;

    for (int i = 1; i < n; ++i){
        l[i] = (2 * (x[i+1] - x[i-1])) - (h[i-1] * u[i-1]);
        u[i] = h[i] / l[i];
        z[i] = (alpha[i] - (h[i-1] * z[i-1])) / l[i];
    }

    l[n] = 1.0;
    z[n] = c[n] = 0.0;

    for (int j = (n - 1); j >= 0; j--){
        c[j] = z[j] - (u[j] * c[j+1]);
        b[j] = ((a[j+1] - a[j]) / h[j]) - ((h[j] / 3) * (c[j+1] + (2 * c[j])));
        d[j] = (c[j+1] - c[j]) / (3 * h[j]);
    }


    std::vector<float> output_array(10);
    for (int i = 0; i < n-1; i++){
        float eval_point = (query_points[i] - x[i]);
        output_array[i] =   a[i] + (eval_point * b[i]) + ( eval_point * eval_point * c[i]) + (eval_point * eval_point * eval_point * d[i]); 
        std::cout << output_array[i] << std::endl;
    }

    system("pause");
    return 0;
}
#包括
#包括
#包括
#包括
//MATLAB:interp1(x,测试数组,查询点,'spline')
int main(){
int size=10;
std::向量测试_阵列(10);
测试数组[0]=测试数组[4]=测试数组[8]=1;
测试数组[1]=测试数组[3]=测试数组[5]=测试数组[7]=测试数组[9]=4;
测试单元阵列[2]=测试单元阵列[6]=7;
std::向量查询点;
对于(int i=0;i<10;i++)
查询点。推回(i+.05);
int n=(大小-1);
std::向量a(n+1);
向量x(n+1);//采样点向量
对于(int i=0;i<(n+1);i++){
x[i]=i+1.0;
a[i]=测试_数组[i];
}
std::载体b(n);
std::向量d(n);
std::向量h(n);
对于(int i=0;i<(n);++i)
h[i]=x[i+1]-x[i];
std::载体α(n);
对于(int i=1;i=0;j--){
c[j]=z[j]-(u[j]*c[j+1]);
b[j]=((a[j+1]-a[j])/h[j])-((h[j]/3)*(c[j+1]+(2*c[j]);
d[j]=(c[j+1]-c[j])/(3*h[j]);
}
std::矢量输出_阵列(10);
对于(int i=0;istd::cout事后看来,您的代码似乎是根据维基百科文章正确编码的。但是,您需要了解有关
interp1
的一些信息,我认为您在使用它检查答案时没有考虑到这些信息


当您指定
样条曲线
标志时,MATLAB的
interp1
假定端点条件为非节点。Wikipedia上指定的算法是自然样条曲线的代码

因此,这可能就是点不匹配的原因。FWIW,咨询:并查看最后一页上的图表。您将看到非a结样条曲线和自然样条曲线具有相同的形状,但当数据仅由样条曲线的端点组成时,具有不同的y值。但是,您是否应该在b中有数据点在端点之间,所有不同种类的样条曲线(或多或少)具有相同的y值

为了完整起见,以下是从我上面提到的PDF注释中提取的图:

如果要使用自然样条曲线,请使用而不是
interp1
。这将提供带有结束条件的三次样条曲线。您可以这样调用
csape

pp = csape(x,y);
x
y
是为样条曲线定义的控制点。默认情况下,这将返回一条自然的样条曲线,这是您所追求的,并且是类型为
ppform
的结构。然后,您可以使用
fnval
计算样条曲线的值:

yval = fnval(pp, xval);
xval
yval
是输入
x
坐标和在该特定
x
处为样条曲线计算的输出

使用此选项,然后检查代码是否与
csape
提供的值匹配


小调
您需要MATLAB中的曲线拟合工具箱来使用
csape
。如果您没有此工具,那么不幸的是,此方法将无法工作。

我认为
interp1
是由MATLAB编码器支持的。

只需使用编码器生成C代码,您就可以得到所需的代码。

这么多…指针!您甚至不需要离开
main()
为什么需要指针而不是本地数组或向量?@cyber我使用向量now@kandre-哦,上帝保佑你。我现在将跟踪你的代码,因为它更可读。非常感谢你的详细回答。理想情况下,我将尝试找出不结条件。我的代码与csape函数输出不完全匹配,而p1和csape结果几乎相同,除了您所说的端点。@kandre好的。今晚晚些时候我会仔细查看您的代码。请继续关注!