C++ 基于向量的gsl线性拟合

C++ 基于向量的gsl线性拟合,c++,vector,gsl,C++,Vector,Gsl,我从一个示例开始,并尝试将数组更改为向量。但是当我编译我的代码时,它会导致这样一个错误,我不理解,也不知道我的代码有什么问题,我非常感谢您事先的评论: 示例1.cpp:19:73:错误:无法将参数“1”的“std::vector”转换为“const double*”转换为“int gsl\u fit\u linear(const double*、size\u t、const double*、size\u t、size\u t、double*、double*、double*)” gsl拟合线性(x

我从一个示例开始,并尝试将数组更改为向量。但是当我编译我的代码时,它会导致这样一个错误,我不理解,也不知道我的代码有什么问题,我非常感谢您事先的评论:

示例1.cpp:19:73:错误:无法将参数“1”的“std::vector”转换为“const double*”转换为“int gsl\u fit\u linear(const double*、size\u t、const double*、size\u t、size\u t、double*、double*、double*)” gsl拟合线性(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;
}
#包括
#包括
#包括
使用名称空间std;
内部主(空)
{
int n=5;
向量x(5,0);
向量y(5,0);
对于(int i=0;i<5;i++)
x[i]=i*3.2;
对于(int i=0;i<5;i++)
x[i]=i*2-11.6;
双c0、c1、cov00、cov01、cov11、sumsq;
gsl拟合线性(x、1、y、1、n、c0、c1、cov00、cov01、cov11和sumsq);
返回0;
}

函数
gsl\u fit\u linear
不采用矢量作为输入,而是采用
常数double*
。必须将向量转换为数组

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

double *xAsArray = &x.front();
小心:如果更改向量(添加/删除元素),指针很可能会失效

您应该这样调用函数:

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

我想补充一点,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) 常数正确性。vector::data()有一个重载函数,当该函数只需要读取数据时,该函数将返回常量指针

3) 空容器。还引用了一个事实,即即使向量为空,也可以使用vector::data。(向gsl发送空容器是不合适的,但通常这是一个非常好的特性)