使用向量的gsl线性拟合

时间:2014-03-07 14:19:04

标签: c++ vector gsl

我已经开始使用gsl fitting examples的示例,并尝试将数组更改为向量。但是当我编译我的代码时,它会导致错误,我不明白并且不知道我的代码有什么问题,我提前感谢任何评论:

example1.cpp:19:73:错误:无法将'std :: vector'转换为'const double *'以将参数'1'转换为'int gsl_fit_linear(const double *,size_t,const double *,size_t,size_t ,double *,double *,double *,double *,double *,double *)'   gsl_fit_linear(x,1,y,1,n,& c0,& c1,& cov00,& cov01,& cov11,& sumsq);

这是代码:

#include <iostream>
#include <vector>
#include <gsl/gsl_fit.h>

using namespace std;
int main (void)
{
    int n = 5;
    vector <double> x(5,0);
    vector <double> y(5,0);
    for(int i=0 ; i< 5; i++)
        x[i] = i*3.2; 

    for(int i=0 ; i< 5; i++)
        x[i] = i*2-11.6; 

    double c0, c1, cov00, cov01, cov11, sumsq;

    gsl_fit_linear (x, 1, y, 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);

  return 0;
}

2 个答案:

答案 0 :(得分:2)

我想补充一点,c ++ 11引入了成员函数vector :: data(),它返回向量的原始指针。 vector :: data()优于@king_nak方法的优点是什么?

1)清晰度。这是主观的,但我认为使用

更优雅
 (...)
 gsl_fit_linear (x.data(), 1, y.data(), 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
 (...) 

2)const-correctness。 vector :: data()有一个重载函数,当函数只需要读取数据时返回const指针

3)空容器。 This answer也引用了这样一个事实:即使向量为空,也可以使用vector :: data。 (将空容器发送到gsl是不行的,但通常这是一个额外的好功能)

答案 1 :(得分:1)

函数gsl_fit_linear不会将向量作为输入,而是const double *。您必须将矢量转换为数组。

由于向量保证将其元素存储在连续的内存区域(就像数组一样),因此可以像数组一样使用向量的数据。只需获得指向其第一个元素的指针:

double *xAsArray = &x.front();

请注意:如果更改了矢量(添加/删除元素),指针最可能会失效!

您应该像这样调用您的函数:

sl_fit_linear (&x.front(), 1, &y.front(), 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);