Eigen

矩阵运算是一种非常重要的运算方式,在Matlab中,矩阵运算可以轻松的实现,但在C++这种偏底层的语言中,若不借助第三方库,矩阵运算需要我们进行较为复杂的代码设计。Eigen库是一个用于线性运算的C++模板库,它支持矩阵运算、矢量运算、数值分析以及相关的算法,安装Eigen库可以大大提高我们的开发效率。

安装与配置Eigen

安装

在ubuntu系统中,安装Eigen库较为简单,只需在命令行中运行

sudo apt-get install libeigen3-dev

之后,我们可以在系统中找到/usr/include/eigen3,这证明我们安装成功

Vscode配置

使用Vscode可以很方便地配置Eigen库的编译,在c_cpp_properties.jsonincludepath中添加"/usr/include/**"即可,如果已经有了那就无需再添加。

{"configurations": [{"browse": {"databaseFilename": "${default}","limitSymbolsToIncludedHeaders": false},"includePath": ["/opt/ros/noetic/include/**","/usr/include/**","/home/aliang/vehicle_sim/devel/include/**"],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/gcc","cStandard": "gnu11","cppStandard": "c++17"}],"version": 4
}

ROS中配置

ROS中,我们还需在功能包的CMakeList中添加:

include_directories("/usr/include/eigen3")

这样我们就可以在程序中用这种方法引入包:

    #include <Eigen/Eigen>#include <Eigen/Dense>#include <Eigen/Geometry>#include <Eigen/Eigenvalues>

否则,需要使用这种方法引入包:

    #include <eigen3/Eigen/Eigen>#include <eigen3/Eigen/Dense>#include <eigen3/Eigen/Geometry>#include <eigen3/Eigen/Eigenvalues>

验证是否可以正常使用

ROS的功能包下新建一个cpp文件

#include <Eigen/Eigen>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <Eigen/Eigenvalues>int main(int argc, char *argv[]){// here is an arbitrary normal vector
// initialized to (1,2,3) upon instantiationEigen::Vector3d normal_vec(1,2,3); return 0;
}

CMakeList中加入

add_executable(vec_compute src/compute.cpp)
target_link_libraries(vec_compute ${catkin_LIBRARIES})

编译通过,证明可以正常使用

基于Eigen库的RBF径向基核函数的二维曲线拟合

RBF径向基核函数的二维曲线拟合

RBF径向基核函数的二维曲线拟合的核心在于,根据 N N N个拟合点求解出 N N N个径向基核函数( N N N个径向基核函数分别对应 N N N个拟合点)的加权数。对于目标二维曲线 F ( x , y ) = 1 F(x,y)=1 F(x,y)=1即优化下列方程:
∑ k = 1 N w k ∗ f ( r ) = 1 \sum_{k=1}^N w_k*f(r) = 1 k=1Nwkf(r)=1
展开为向量形式:
( f ( ∣ ∣ q − q 1 ∣ ∣ ) f ( ∣ ∣ q − q 2 ∣ ∣ ) ⋯ f ( ∣ ∣ q − q N ∣ ∣ ) ) ∗ ( w 1 w 2 ⋮ w N ) = 1 \begin{pmatrix} f(||q-q_1||) & f(||q-q_2||) & \cdots & f(||q-q_N||) \end{pmatrix}* \begin{pmatrix} w_1\\ w_2\\ \vdots\\ w_N \end{pmatrix}=1 (f(∣∣qq1∣∣)f(∣∣qq2∣∣)f(∣∣qqN∣∣)) w1w2wN =1
其中 q N q_N qN表示被拟合的 N N N个点,由于每个被拟合点都满足该公式,替换掉 q q q,可以再次展开为:
( f ( ∣ ∣ q 1 − q 1 ∣ ∣ ) f ( ∣ ∣ q 1 − q 2 ∣ ∣ ) ⋯ f ( ∣ ∣ q 1 − q N ∣ ∣ ) f ( ∣ ∣ q 2 − q 1 ∣ ∣ ) f ( ∣ ∣ q 2 − q 2 ∣ ∣ ) ⋯ f ( ∣ ∣ q 2 − q N ∣ ∣ ) ⋮ ⋮ ⋱ ⋮ f ( ∣ ∣ q N − q 1 ∣ ∣ ) f ( ∣ ∣ q N − q 2 ∣ ∣ ) ⋯ f ( ∣ ∣ q N − q N ∣ ∣ ) ) ∗ ( w 1 w 2 ⋮ w N ) = 1 \begin{pmatrix} f(||q_1-q_1||) & f(||q_1-q_2||) & \cdots & f(||q_1-q_N||)\\ f(||q_2-q_1||) & f(||q_2-q_2||) & \cdots & f(||q_2-q_N||)\\ \vdots & \vdots & \ddots & \vdots\\ f(||q_N-q_1||) & f(||q_N-q_2||) & \cdots & f(||q_N-q_N||)\\ \end{pmatrix}* \begin{pmatrix} w_1\\ w_2\\ \vdots\\ w_N \end{pmatrix}=1 f(∣∣q1q1∣∣)f(∣∣q2q1∣∣)f(∣∣qNq1∣∣)f(∣∣q1q2∣∣)f(∣∣q2q2∣∣)f(∣∣qNq2∣∣)f(∣∣q1qN∣∣)f(∣∣q2qN∣∣)f(∣∣qNqN∣∣) w1w2wN =1
左边的矩阵可以看为一个Gram相关矩阵形式,则可以求出我们想要的 w ⃗ \vec{w} w

w ⃗ = G r a m M a t r i x N × N − 1 ∗ 1 N × 1 \vec{w} = GramMatrix^{-1}_{N \times N}*1_{N \times 1} w =GramMatrixN×N11N×1

选取径向基核函数为 f ( r ) = r 2 l n ( r + 1 ) f(r)=r^2ln(r+1) f(r)=r2ln(r+1)

基于Eigen库的实现

#include <Eigen/Eigen>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <Eigen/Eigenvalues>
#include <iostream>
#include <cmath>int main(int argc, char *argv[]){int num = 6;Eigen::MatrixXd p_x(1, num);Eigen::MatrixXd dis_x(num, num);Eigen::MatrixXd p_y(1, num);Eigen::MatrixXd dis_y(num, num);Eigen::MatrixXd dis_sqr(num, num);Eigen::MatrixXd dis_r(num, num);Eigen::MatrixXd w(num, 1);p_x << 1.5, 1.5, -0.75, -3, -0.75, 1.5;p_y << 0, 2.6, 1.3, 0, -1.3, -2.6;Eigen::MatrixXd mat_x = p_x.replicate(num, 1); // 该函数将p_x作为一个矩阵元素,填充出n*m的矩阵Eigen::MatrixXd mat_y = p_y.replicate(num, 1);mat_x = mat_x - p_x.transpose().replicate(1, num);mat_y = mat_y - p_y.transpose().replicate(1, num);dis_x = mat_x.cwiseProduct(mat_x); //对应位置相乘dis_y = mat_y.cwiseProduct(mat_y);dis_sqr = dis_x + dis_y;dis_r = dis_sqr.unaryExpr([](double x){return std::sqrt(x);});std::cout << "矩阵:\n" << dis_r << std::endl;dis_r = dis_r.unaryExpr([](double x){return x*x*log(x+1);});dis_r = dis_r.inverse();w = dis_r.rowwise().sum();std::cout << "矩阵:\n" << w << std::endl;return 0;
}

Matlab计算结果相同

w=-0.04752690.0351389-0.04752050.0351453-0.04752050.0351389

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86850.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86850.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86850.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】外部中断

STM32 外部中断&#xff08;EXTI&#xff09;概述 这篇文章结合示例代码&#xff0c;系统性地讲述 STM32 外部中断&#xff08;EXTI&#xff09;实验的原理、以及配置流程。目的在于辅助读者掌握STM32F1 外部中断机制。 STM32F1xx官方资料&#xff1a;《STM32中文参考手册V10》…

LeetCode Hot100 算法题 (矩阵篇)

1、73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]// 将第一行…

Flutter基础(项目创建)

一、使用命令行创建项目 1. 确认 Flutter 环境正常 要保证 Flutter SDK 已经正确安装&#xff0c;并且环境变量配置无误。可以通过执行以下命令来验证&#xff1a; flutter doctor 要保证所有检查项都显示绿色对勾&#xff0c;要是有问题&#xff0c;可按照提示进行修复。 …

【Actix Web】Rust Web开发实战:Actix Web框架全面指南(2025企业级应用版)

​ 在2025年高并发、低延迟成为Web服务核心指标的背景下&#xff0c;​​Actix Web凭借异步Actor模型与零成本抽象​​&#xff0c;成为Rust生态中生产环境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技术&#xff0c;覆盖​​百万级并发架构设计​​、​​内存安全…

HTML之常用基础标签

HTML之常用基础标签 一、HTML文档基本结构标签1. <html>标签2. <head>标签3. <body>标签 二、文本相关基础标签1. 标题标签&#xff08;<h1> - <h6>&#xff09;2. 段落标签&#xff08;<p>&#xff09;3. 换行标签&#xff08;<br>…

外键列索引优化:加速JOIN查询的关键

在使用数据库时&#xff0c;特别是在执行涉及JOIN操作的查询时&#xff0c;优化外键列的索引是非常重要的。外键通常用于建立表之间的关联&#xff0c;而JOIN操作则是基于这些外键列来实现的。下面是一些关键步骤和技巧&#xff0c;可以帮助你优化外键列的索引&#xff0c;从而…

2025年 UI 自动化框架使用排行

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 </

【软考高项论文】论信息系统项目的整体管理

摘要 在信息系统项目的管理中&#xff0c;整体管理处于核心地位&#xff0c;对项目全局规划与协调起着关键作用&#xff0c;保障项目各阶段目标一致且高效执行。本文结合作者参与的 2024 年 6 月启动的信息系统项目&#xff0c;深入探讨项目整体管理的过程&#xff0c;着重阐述…

(4)Wireshark捕获设置

1.简介 WireShark的强大之处就在于不用你再做任何配置就可以抓取http或者https的包。主要是讲解和分享如何使用WireShark抓包。 2.运行Wireshark 安装好 Wireshark 以后&#xff0c;就可以运行它来捕获数据包了。方法如下&#xff1a; 1.在 Windows 的“开始”菜单中&#…

智慧校园电子班牌系统源码的开发与应用,基于Java/SpringBoot后端、Vue2前端、MySQL5.7数据库

智慧校园系统源码&#xff0c;智慧班牌源码&#xff0c;java语言 技术栈&#xff1a; ‌后端开发‌&#xff1a;采用Java语言和Spring Boot框架进行开发。Java是一种广泛使用的、面向对象的编程语言&#xff0c;而Spring Boot是基于Spring框架的快速应用开发框架&#xff0c;能…

工程优化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信对比

WebSocket、WSS&#xff08;WebSocket Secure&#xff09;和SSE&#xff08;Server-Sent Events&#xff09;是三种常见的实时通信技术&#xff0c;它们的核心区别在于通信方向、协议实现、数据格式和适用场景。以下是分维度的详细解释&#xff0c;并附带Python示例和应用场景选…

【TiDB 社区智慧合集】 TiDB x 运营商|掌上营业厅、账务、物联网等多核心业务场景的实战应用案例

作者&#xff1a; Billmay表妹 原文来源&#xff1a; https://tidb.net/blog/bb1467af 在信息基础设施国产化战略加速落地的背景下&#xff0c;电信及广电领域正迎来数据库国产化替代的关键转型期。TiDB 凭借自身技术创新优势&#xff0c;深度携手各大运营商&#xff0c;以全…

Java 17 下 Spring Boot 与 Pulsar 队列集成实战:生产者与消费者实现指南

Pulsar队列与Springboot集成有2种模式&#xff1a;官方pulsar-client 或社区Starter&#xff08;如pulsar-spring-boot-starter&#xff09; 如果考虑最新、最快、最齐全的功能&#xff0c;使用官方pulsar-client如果考虑快速低成本接入&#xff0c;使用社区Starter&#xff0…

《Go语言高级编程》RPC 入门

《Go语言高级编程》RPC 入门 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是分布式系统中不同节点间的通信方式&#xff0c;允许程序像调用本地函数一样调用远程服务的方法。 Go 语言的标准库 net/rpc 提供了基础的…

第N5周:Pytorch文本分类入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.加载数据 import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

uniappx 安卓app项目本地打包运行,腾讯地图报错:‘鉴权失败,请检查你的key‘

根目录下添加 AndroidManifest.xml 文件&#xff0c; <application><meta-data android:name"TencentMapSDK" android:value"腾讯地图申请的key" /> </application> manifest.json 文件中添加&#xff1a; "app": {"…

【向上教育】结构化面试开口秘籍.pdf

向 上 教 育 XI A N G S H A N G E D U C A T I O N 结构化 面试 开口秘笈 目 录 第一章 自我认知类 ........................................................................................................................... 2 第二章 工作关系处理类 .......…

Webpack 热更新(HMR)原理详解

&#x1f525; Webpack 热更新&#xff08;HMR&#xff09;原理详解 &#x1f4cc; 本文适用于 Vue、React 等使用 Webpack 的项目开发者&#xff0c;适配 Vue CLI / 自定义 Webpack 项目。 &#x1f3af; 一、什么是 HMR&#xff1f; Hot Module Replacement 是 Webpack 提供的…

MySQL索引完全指南

一、索引是什么&#xff1f;为什么这么重要&#xff1f; 索引就像字典的目录 想象一下&#xff0c;你要在一本1000页的字典里找"程序员"这个词&#xff0c;你会怎么做&#xff1f; 没有目录&#xff1a;从第1页开始一页一页翻&#xff0c;可能要翻500页才能找到有…

学习使用dotnet-dump工具分析.net内存转储文件(2)

运行ShenNiusModularity项目&#xff0c;使用createdump工具dump完整的进程内存映射文件&#xff0c;然后运行dotnet-dump analyze命令加载dump文件。   可以先使用dumpheap命令显示有关垃圾回收堆的信息和有关对象的收集统计信息。dumpheap支持多类参数&#xff08;如下所示…