C++ Eigen库实现最小二乘拟合的示例代码

 更新时间:2023年07月19日 14:24:23   作者:RockWang.  
Eigen 是一个线性算术的 C++ 模板库,功能强大、快速、优雅以及支持多平台,本文主要为大家介绍了C++利用Eigen库实现最小二乘拟合的示例代码,希望对大家有所帮助

前言

入职第二周的任务是将导师的Python代码C化,发现Python中存在Numpy包直接调用np.polyfit就好了,但是C++不存在需要造轮子。

示例代码

#include <iostream>
#include <cmath>
#include <vector>
#include <Eigen/QR>
#include "xtensor/xarray.hpp"
void polyfit(	const std::vector<double> &t,
                 const std::vector<double> &v,
                 std::vector<double> &coeff,
                 int order

)
{
    // Create Matrix Placeholder of size n x k, n= number of datapoints, k = order of polynomial, for exame k = 3 for cubic polynomial
    Eigen::MatrixXd T(t.size(), order + 1);
    Eigen::VectorXd V = Eigen::VectorXd::Map(&v.front(), v.size());
    //std::cout<<"ceshi"<<std::endl;
    //std::cout<<V<<std::endl;
    Eigen::VectorXd result;

    // check to make sure inputs are correct
    assert(t.size() == v.size());
    assert(t.size() >= order + 1);
    // Populate the matrix
    for(size_t i = 0 ; i < t.size(); ++i)
    {
        for(size_t j = 0; j < order + 1; ++j)
        {
            T(i, j) = pow(t.at(i), j);
        }
    }
    std::cout<<T<<std::endl;

    // Solve for linear least square fit
    result  = T.householderQr().solve(V);
    coeff.resize(order+1);
    for (int k = 0; k < order+1; k++)
    {
        coeff[k] = result[k];
    }

}

int main()
{
    // time value
    std::vector<double> time = {-2, 4, 6, 7, 9};
    std::vector<double> velocity = {5, 17, 37, 49, 82};

    // placeholder for storing polynomial coefficient
    std::vector<double> coeff ;
    polyfit(time, velocity, coeff, 2);
    xt::xarray<double> c = xt::zeros<double>({3});
    for(int i = 0; i < coeff.size(); i++)
    {
        c[i] = coeff[i];
    }
    
    std::vector<double> fitted_velocity;
    std::cout<< "Printing fitted values" << std::endl;
    for(int p = 0; p < time.size(); ++ p)
    {
        double vfitted = coeff[0] + coeff[1]*time.at(p) + coeff[2]*(pow(time.at(p), 2)) ;
        std::cout<< vfitted<<", ";
        fitted_velocity.push_back(vfitted);
    }
    std::cout<<std::endl;
    for(int i  = 0; i < c.size(); i++)
    {
        std::cout<<c[i]<<std::endl;
    }
    std::cout<<std::endl;


    return 0;
}

输出结果

到此这篇关于C++ Eigen库实现最小二乘拟合的示例代码的文章就介绍到这了,更多相关C++ Eigen内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++lambda表达式使用介绍

    C++lambda表达式使用介绍

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名。本文就来为大家详细讲讲C++中Lambda表达式的使用,需要的可以参考一下
    2022-08-08
  • C++实现学生考勤信息管理系统

    C++实现学生考勤信息管理系统

    这篇文章主要为大家详细介绍了C++实现学生考勤信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • QT5中使用QRegularExpression代替QRegExp方法代码

    QT5中使用QRegularExpression代替QRegExp方法代码

    这篇文章主要给大家介绍了关于QT5中使用QRegularExpression代替QRegExp的相关资料,正则表达式(regep)是处理字符串和文本的强大工具,验证regexp可以测试子字符串是否满足某些条件,例如是整数或不包含空格,需要的朋友可以参考下
    2024-04-04
  • c++只保留float型的小数点后两位问题

    c++只保留float型的小数点后两位问题

    这篇文章主要介绍了c++只保留float型的小数点后两位问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言 指针变量作为函数参数详解

    C语言 指针变量作为函数参数详解

    本文主要介绍C语言 指针变量作为函数参数,这里整理了相关资料和示例代码,以便大家学习参考理解知识点,有需要的小伙伴可以参考下
    2016-08-08
  • C语言中结构体(struct)的几种初始化方法

    C语言中结构体(struct)的几种初始化方法

    相信大家都知道struct结构体是C语言中非常重要的复合类型,初始化的方法很多,那么小编下面对这些方法进行总结,便于自己和大家以后查阅,有需要的可以参考借鉴。
    2016-08-08
  • 浅谈C++不同继承之间的关系

    浅谈C++不同继承之间的关系

    本文主要介绍了浅谈C++不同继承之间的关系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 基于c的for循环中改变变量值的问题

    基于c的for循环中改变变量值的问题

    本篇文章是对c语言的for循环中改变变量值的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++对象的动态建立与释放详解

    C++对象的动态建立与释放详解

    我们知道可以用new运算符可以动态的分配内存,用delete运算符可以释放这些内存。当我们使用new运算符动态的分配一个内存之后,会自动返回一个该内存段的起始地址,也就是指针。
    2013-10-10
  • C语言实现队列的示例详解

    C语言实现队列的示例详解

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作。本文将用C语言实现队列,感兴趣的可以了解一下
    2022-06-06

最新评论