当前位置: 首页 > article >正文

一维线性插值算法C++详细实现

算法概述算法实现下面提供一套健壮的一维线性插值 C 实现重点考虑了数据预处理、边界处理、重复点合并及浮点容差等鲁棒性细节。#include vector #include algorithm #include stdexcept #include cmath #include limits #include utility /** * 鲁棒的一维线性插值器 * tparam T 浮点类型float/double/long double */ templatetypename T class LinearInterpolator { public: using value_type T; /** * 构造函数接收原始数据点自动进行排序、去重相同 x 取 y 均值 * param x 自变量数组 * param y 因变量数组 * throw std::invalid_argument 如果 x 和 y 长度不相等 */ LinearInterpolator(const std::vectorT x, const std::vectorT y) { if (x.size() ! y.size()) { throw std::invalid_argument(x and y must have the same size); } if (x.empty()) { return; // 空数据后续插值返回 NaN } // 1. 合并为点对并排序 std::vectorstd::pairT, T points; points.reserve(x.size()); for (size_t i 0; i x.size(); i) { points.emplace_back(x[i], y[i]); } std::sort(points.begin(), points.end(), [](const auto a, const auto b) { return a.first b.first; }); // 2. 合并相同 x 的点考虑浮点容差 const T eps std::numeric_limitsT::epsilon() * 100; std::vectorstd::pairT, T merged; merged.reserve(points.size()); for (const auto p : points) { if (merged.empty() || std::abs(p.first - merged.back().first) eps * (std::abs(p.first) T(1))) { merged.push_back(p); } else { // 对相同 x 的 y 取平均值可根据需求改为其他策略 merged.back().second (merged.back().second p.second) / T(2); } } // 3. 存储处理后的数据 x_.reserve(merged.size()); y_.reserve(merged.size()); for (auto p : merged) { x_.push_back(p.first); y_.push_back(p.second); } } /** * 单点插值外推时返回最近点的 y 值即限幅 clamp * param x_query 待插值的自变量 * return 插值结果无数据点时返回 NaN */ T interpolate(T x_query) const { if (x_.empty()) { return std::numeric_limitsT::quiet_NaN(); } // 处理边界直接返回最近点的 y 值限幅 if (x_query x_.front()) { return y_.front(); } if (x_query x_.back()) { return y_.back(); } // 二分查找第一个大于 x_query 的索引 auto it std::upper_bound(x_.begin(), x_.end(), x_query); size_t right_idx it - x_.begin(); // 右侧点索引 size_t left_idx right_idx - 1; // 左侧点索引 T x_left x_[left_idx]; T x_right x_[right_idx]; T y_left y_[left_idx]; T y_right y_[right_idx]; // 线性插值区间宽度已保证 0因为重复 x 已合并 T t (x_query - x_left) / (x_right - x_left); return y_left t * (y_right - y_left); } /** * 多点插值 * param x_queries 待插值的自变量数组 * return 对应的插值结果数组 */ std::vectorT interpolate(const std::vectorT x_queries) const { std::vectorT results; results.reserve(x_queries.size()); for (T xq : x_queries) { results.push_back(interpolate(xq)); } return results; } private: std::vectorT x_; /// 排序且去重后的自变量 std::vectorT y_; /// 对应的因变量 };鲁棒性说明输入校验检查x和y长度是否一致不一致则抛异常。空数据集时插值返回NaN避免未定义行为。数据预处理自动排序无论原始数据顺序如何均按x升序排列保证后续二分查找正确。合并重复x使用相对容差判断x是否相等考虑浮点精度对相同x的y取平均值避免除零或歧义。经过预处理后内部存储的x严格递增且无重复插值区间宽度恒为正。边界处理查询点超出数据范围时采用限幅clamp策略直接返回最近数据点的y值避免不合理外推导致结果失控。若数据仅有一个点任何查询均返回该点的y。数值稳定性合并重复点时使用相对容差避免因浮点误差导致微小区间被保留从而防止后续除零风险。插值计算t (x_query - x_left) / (x_right - x_left)在区间宽度 0 时安全。通用性模板支持float、double、long double等浮点类型。可轻松扩展外推模式如线性外推只需修改边界处理部分。使用示例#include iostream #include vector int main() { // 原始数据包含重复 x 和乱序 std::vectordouble x {3.0, 1.0, 2.0, 2.0, 4.0}; std::vectordouble y {30.0, 10.0, 20.0, 25.0, 40.0}; // 构造插值器自动排序并合并 x2.0 的点取 y 均值 (2025)/2 22.5 LinearInterpolatordouble interp(x, y); // 插值 std::vectordouble queries {0.0, 1.5, 2.0, 3.5, 5.0}; auto results interp.interpolate(queries); // 输出结果 for (size_t i 0; i queries.size(); i) { std::cout f( queries[i] ) results[i] \n; } return 0; } 输出 f(0) 10 // 限幅到最近点 x1, y10 f(1.5) 15 // 插值于 (1,10) 和 (2,22.5) f(2) 22.5 // 合并后的点 f(3.5) 35 // 插值于 (3,30) 和 (4,40) f(5) 40 // 限幅到 x4, y40单点插值 int main() { // 原始数据包含重复 x 和乱序 std::vectordouble x {0.02, 0.04, 0.06, 0.08, 0.10}; std::vectordouble y {13.0, 10.0, 8.0, 6.0, 6.0}; // 构造插值器自动排序并合并 x2.0 的点取 y 均值 (2025)/2 22.5 LinearInterpolatordouble interp(x, y); // 插值 auto results interp.interpolate(0.075); std::cout results results std::endl; return 0; }该实现可在大多数工程场景下稳定运行用户也可根据具体需求调整合并策略如取第一个值或外推方式。语法解读std::sort(points.begin(), points.end(), [](const auto a, const auto b) { return a.first b.first; });1. ‌代码功能解析‌‌points.begin(),points.end()‌指定排序范围整个容器。‌Lambda表达式‌[](const auto a, const auto b) { return a.first b.first; }定义比较规则比较两个元素的first成员若a.first b.first则a应排在b前面升序。2. ‌关键点‌‌适用容器‌points需支持随机访问迭代器如std::vector、std::deque等。‌排序稳定性‌std::sort不是稳定排序相等元素的相对顺序可能改变。若需稳定排序改用std::stable_sort。‌性能‌时间复杂度为O(n log n)。3. ‌常见问题‌‌降序排序‌将Lambda中的改为即可。const T eps std::numeric_limitsT::epsilon() * 100;‌1. 核心功能‌‌std::numeric_limitsT::epsilon()‌返回类型T的机器精度即 1 与大于 1 的最小可表示值之间的差值。例如float约1.19209e-07double约2.22045e-16‌乘以 100‌将机器精度放大 100 倍通常用于避免浮点数比较时的精度误差例如比较两个浮点数是否“近似相等”。‌2. 典型应用场景‌‌浮点数比较‌用于判断两个浮点数是否在允许的误差范围内相等templatetypename T bool isApproxEqual(T a, T b, T eps) { return std::abs(a - b) eps; }auto it std::upper_bound(x_.begin(), x_.end(), x_value);这段代码使用std::upper_bound在有序范围[x_.begin(), x_.end())中查找第一个‌大于‌x_value的元素并返回指向该元素的迭代器it。以下是详细解析‌1. 核心功能‌‌std::upper_bound‌二分查找算法要求输入范围‌有序‌默认按升序返回第一个满足*it x_value的迭代器。‌返回值it‌若找到it指向第一个大于x_value的元素。若所有元素均不大于x_value则返回x_.end()。‌自定义比较规则‌若元素为自定义类型或需降序排序需传入比较函数auto it std::upper_bound(x_.begin(), x_.end(), x_value, [](const auto a, const auto b) { return a b; }); // 降序规则

相关文章:

一维线性插值算法C++详细实现

算法概述&#xff1a;算法实现&#xff1a;下面提供一套健壮的一维线性插值 C 实现&#xff0c;重点考虑了数据预处理、边界处理、重复点合并及浮点容差等鲁棒性细节。#include <vector> #include <algorithm> #include <stdexcept> #include <cmath> …...

能看、能玩、还能带走!ANTINSKY全系列3D打印材料亮相2026 TCT亚洲展

ANTINSKY蚁在云端&#xff0c;打造一站式3D打印采购新体验。2026年3月17日-19日&#xff0c;第12届TCT亚洲展将在上海国家会展中心举行。作为亚太地区增材制造行业的重要展会&#xff0c;本届展会预计将汇聚550余家展商。据资源库了解&#xff0c;ANTINSKY&#xff08;蚁在云端…...

前端转型全栈工程师超详细指南:零基础入门到实战落地,攻克转型难点

&#x1f3f7;️ 标签&#xff1a;全栈开发、前端转型、Node.js、全栈学习路线、后端入门、实战项目 &#x1f4cc; 摘要&#xff1a;本文针对前端开发者转型全栈工程师的痛点&#xff0c;详细拆解转型前提、分阶段学习路径、核心技术栈、实操项目、难点攻克方案&#xff0c;给…...

微电网的功率流计算:基础方法与影响因素

在新型电力系统向“源网荷储”协同转型的背景下&#xff0c;微电网作为整合分布式能源、优化终端能源配置、保障供电安全的核心载体&#xff0c;其运行状态的精准把控是实现高效、稳定、安全运行的前提。功率流计算作为微电网分析、设计、调控与运维的核心基础&#xff0c;本质…...

黑马点评实战篇|第六篇:秒杀优化

秒杀优化思路先看原本的思路&#xff1a;1、查询优惠卷2、判断秒杀库存是否足够3、查询订单4、校验是否是一人一单5、扣减库存6、创建订单这6大步骤会在一个线程里串行执行&#xff0c;大大拖慢响应速度&#xff0c;所以需要程序异步执行优化思路只需要把耗时较短的流程&#x…...

5分钟搞定GEO优化源码系统,多平台一键投喂源码系统搭建全攻略

温馨提示&#xff1a;文末有资源获取方式AI搜索时代已全面到来&#xff01;想让你的企业品牌和产品出现在DeepSeek、豆包等AI的搜索结果中&#xff1f;GEO&#xff08;生成式引擎优化&#xff09;是必经之路。今天带来春哥团队GEO优化源码系统&#xff0c;支持多平台一键投喂、…...

NIQ在Ask Arthur中推出全新AI驱动分析功能的测试版

AI引导分析帮助品牌和零售商将数据转化为可直接用于决策的洞察消费者情报领域的全球领导者NIQ (NYSE: NIQ)在NIQ Discover平台的Ask Arthur中推出了全新AI驱动分析功能的测试版。升级后的服务可引导用户完成端到端分析&#xff0c;帮助他们识别数据中的关键信息、理解趋势成因&…...

vue文件template ,script, style 多文件写法小记

当页面需求大代码量过多时&#xff0c;*.vue文件中包含很多的html&#xff0c;JS &#xff0c;css 代码&#xff0c;对于后续的代码的维护管理非常的不便&#xff0c;这个时候就有必要把JS &#xff0c;Template ,CSS 分开写&#xff0c;像微信小程序一样&#xff0c;这里记录几…...

朱雀越严,我这个工具越好用|亲测稳过

很多内容从业者对朱雀的第一反应是恐慌&#xff0c;模板失效、爆文文案不好用了&#xff0c;连正常润色都担心「误伤」。但真正跑了一段之后&#xff0c;我的体感反而是&#xff0c;越严苛的检测&#xff0c;越倒逼你回到「表达本身」&#xff0c;而一些为 AI 原生创作设计的平…...

2026年AI岗12倍疯涨!年薪破亿?普通人如何抢占未来入场券?

文章指出2026年AI岗位同比增长12倍&#xff0c;高薪人才年薪可达千万。回顾2005-2025年薪资排行变迁&#xff0c;呈现制造业、房地产、互联网、金融科技到AI的五大时代轮替&#xff0c;每一轮都伴随着财富重新分配。AI浪潮下&#xff0c;人才垄断程度更高、门槛更高、替代更快&…...

使用格子玻尔兹曼方法模拟方腔流:生成流线、速度、压力图并保存动态展示的研究结果

使用格子玻尔兹曼方法&#xff08;LBM&#xff09;模拟方腔流&#xff0c;生成流线、速度、压力图&#xff0c;并可保存动图.今天咱们来玩点流体力学的小把戏——用格子玻尔兹曼方法&#xff08;LBM&#xff09;整一个方腔流动模拟。这玩意儿比传统NS方程解法有意思多了&#x…...

刷题题单目录

题单 这篇文章将是本人刷题题单记录帖子,为了督促自己以及分享自己的刷题感想 5.最长回文子串 3.无重复字符的最长子串 200.岛屿数量 56.合并区间 239.滑动窗口最大值 22.括号生成 121.买卖股票的最佳时机 206.反转链表 72.编辑距离 25.K个一组翻转链表 1143.最长公共子序列 10…...

Python 模块和包引用配置详解

导读在 Python 开发中&#xff0c;高效管理模块&#xff08;Module&#xff09;与包&#xff08;Package&#xff09;的引用是构建可维护、可扩展项目的基石。本指南将从基础语法、包结构配置、搜索路径机制 (sys.path) 以及最佳实践四个维度进行深度解析&#xff0c;帮助您解决…...

06Halcon图像预处理报告

Halcon图像预处理学习报告一、概述图像预处理是机器视觉系统中的关键环节&#xff0c;其目的是改善图像质量&#xff0c;突出感兴趣的特征&#xff0c;为后续的图像分析和识别奠定基础。Halcon作为业界领先的机器视觉软件库&#xff0c;提供了丰富的图像预处理算子。本报告将重…...

两会洞察|底座不稳,智能难成:能源行业数字化的必由之路

今年两会&#xff0c;“能源安全”“新型能源体系”“数字基础设施”“安全发展”等关键词持续成为关注焦点。对于能源行业而言&#xff0c;这些表述并不只是宏观层面的政策方向&#xff0c;更意味着行业正在进入一个新的阶段&#xff1a;数字化建设不再停留在单点系统上线和局…...

AD 极坐标操作方式

问题描述 关于AD软件一些操作&#xff0c;因为好久没有使用&#xff0c;很多操作导致忘记&#xff0c;做下记录。 解决方案&#xff1a; 1.AD极坐标调出并设置&#xff0c;根据自己项目来设置步长&#xff0c;角度方向等。最后&#xff0c;成功是建立在实践基础上&#xff0c;遇…...

2026年热销榜单:高品质花园围栏护栏厂家推荐

在2026年&#xff0c;花园围栏的需求持续增长&#xff0c;各种护栏厂家纷纷推出创新产品。不同品牌凭借其独特的设计和高品质材料&#xff0c;满足了消费者对美观性和安全性的双重需求。我们将介绍一些市场中备受推崇的厂家&#xff0c;包括它们的设计理念、产品特色及用户反馈…...

JAVA国际版人力资源招聘系统源码:社招+校招双模式,多语言可商用

随着全球化人才流动加剧&#xff0c;企业跨境招聘、国际人才求职需求日益旺盛&#xff0c;同时社会招聘与校园招聘的场景差异显著&#xff0c;传统招聘系统多局限于单一招聘类型、单语言场景&#xff0c;无法适配国际企业多语言招聘、社招校招分层管理、跨境人才对接的核心需求…...

4.4 网络运营商的内部

&#x1f4da; 本文是《网络是怎样连接的》精读系列第 19 篇&#xff0c;全书逐章精讲、通俗拆解&#xff0c;帮你从零吃透计算机网络的底层逻辑。当数据包通过接入网的隧道技术&#xff0c;成功抵达运营商的 BAS&#xff08;宽带接入服务器&#xff09;后&#xff0c;就正式踏…...

西安AI搜索优化软件亲测效果分享

行业痛点分析随着生成式人工智能&#xff08;如ChatGPT、DeepSeek、Gemini等&#xff09;的普及&#xff0c;用户获取信息的方式正在发生重大变化。越来越多的用户不再通过传统搜索引擎逐个点击网站&#xff0c;而是直接通过AI获得整合答案。然而&#xff0c;这一新模式也带来了…...

零代码玩转自动化:OpenClaw可视化编排功能入门

让自动化触手可及 对于很多非技术用户来说&#xff0c;编写代码来配置工作流是一个高门槛。OpenClaw的可视化编排功能通过图形化界面&#xff0c;让用户可以像搭积木一样构建自动化流程&#xff0c;无需编写代码就能实现复杂的业务逻辑。 本文将带你了解OpenClaw可视化编排功能…...

隧道超声波风速风向检测器:赋能智慧交通管理、灾害预防与应急管理

隧道超声波风速风向检测器凭借其高精度、实时性、抗干扰性强及无机械磨损等特性&#xff0c;在智慧交通管理、灾害预防与应急管理中发挥着关键作用&#xff0c;为隧道安全运营提供了强有力的技术支撑。一、智慧交通管理&#xff1a;精准感知气流&#xff0c;优化通风策略实时监…...

互联网医疗场景下的大厂Java面试全流程 —— Spring Boot、MyBatis、Redis、Kafka、Spring Security、AI智能分析解读

互联网医疗场景下的大厂Java面试全流程 —— Spring Boot、MyBatis、Redis、Kafka、Spring Security、AI智能分析解读 场景设定 互联网医疗平台&#xff0c;包含在线问诊、处方开具、药品下单、支付、数据分析等功能&#xff0c;要求高并发、强安全、实时消息推送与智能辅助诊断…...

AI智能体协议乱象背后:MCP、A2A、ACP……谁将成为下一代互联网的“HTTP“?

在AI智能体&#xff08;Agent&#xff09;迅猛发展的当下&#xff0c;MCP、A2A、ACP、UTCP、ANP……各种协议层出不穷&#xff0c;几乎每隔一段时间&#xff0c;科技公司就会为“字母家族”增添新成员。归根结底&#xff0c;所有AI智能体协议的目标都是标准化智能体的通信方式&…...

选对自动获客软件,少走弯路!AI 招财兔实测体验

市面上自动获客软件五花八门&#xff0c;但大多功能单一、操作复杂、稳定性差、效果不明显&#xff0c;企业买回去往往无法落地。AI 招财兔自动获客软件凭借 “全功能、易操作、高转化、超稳定” 四大特点&#xff0c;成为企业真正可落地的首选获客工具。实测体验中&#xff0c…...

基于Systick系统滴答定时器的延时时间计算

介绍一套嵌入式系统中常用的非阻塞延时 / 超时判断工具宏&#xff1a;#define SysTime() HAL_GetTick() //ms级别 #define SysTimeDiff(new, old) ((new) - (old)) #define SysTimeDiffCurrent(oldTime) SysTimeDiff(SysTime(), (oldTime)) #define SysTimeHasPast(oldTime…...

软件测试工程师必须掌握的数据库基础知识:从入门到实战

在软件测试工作中&#xff0c;数据库知识不是"加分项"&#xff0c;而是"必备项"。无论你是做功能测试、接口测试还是自动化测试&#xff0c;几乎每一天都会和数据库打交道&#xff1a;验证数据是否正确写入构造测试数据分析Bug产生的原因性能测试中定位慢S…...

抖音豆包九宫格验证码识别

一、简介 上图是抖音九宫格验证码图片的样例图片。这款验证码确实有很大的难度&#xff0c;有一下几个特点&#xff1a; 1、首先是图片种类非常多。 2、其次图片都是由AI随机生成&#xff0c;每一张图片都不一样。 3、还需要结合语义进行理解 二、识别准备 经过我们几个月…...

彻底卸载OpenClaw:完整指南

好的&#xff0c;以下是在 Windows 系统上完整卸载 OpenClaw 软件的详细步骤&#xff1a;完整卸载 OpenClaw 的步骤通过控制面板卸载打开 控制面板 > 程序 > 程序和功能在程序列表中找到 OpenClaw右键点击选择 卸载按照提示完成卸载向导清理残留文件打开文件资源管理器&a…...

探索基于Matlab的齿轮 - 轴 - 轴承系统含间隙非线性动力学模型

基于matlab的齿轮-轴-轴承系统的含间隙非线性动力学模型&#xff0c;根据牛顿第二定律&#xff0c;建立齿轮系统啮合的非线性动力学方程&#xff0c;同时也主要应用修正Capone模型的滑动轴承无量纲化雷诺方程&#xff0c;利用这些方程推到公式建模&#xff1b;用MATLAB求解画出…...