C++ 基于向量的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、y、1、n、c0、c1、cov00、cov01、cov11和sumsq) 这是代码: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
#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发送空容器是不合适的,但通常这是一个非常好的特性)