【问题标题】:gsl linear fitting using vectors使用向量的 gsl 线性拟合
【发布时间】:2014-04-10 17:55:45
【问题描述】:

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

example1.cpp:19:73: 错误:无法将参数 '1' 的 'std::vector' 转换为 'const double*' 到 'int gsl_fit_linear(const double*, size_t, const double*, size_t, size_t , 双*, 双*, 双*, 双*, 双*, 双*)' 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;
}

【问题讨论】:

    标签: c++ vector gsl


    【解决方案1】:

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

    1) 清晰度。这是主观的,但我认为使用起来更优雅

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

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

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

    【讨论】:

      【解决方案2】:

      函数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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 2012-12-19
        • 2021-05-21
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        相关资源
        最近更新 更多