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

【31】C++实战篇——C++ 从数组里找出相邻两个波谷之间的主波峰的y值和其对应下标i,考虑到波形的上升和下降情况

文章目录

  • 1 问题描述
  • 2 代码实现

1 问题描述

C++ 一个int *arr的数组里面存储一段数据类似波形图,当遇到0时认为是波谷,

现在要找到相邻两个波谷之间的主波峰的y值和其对应的X坐标。已知波谷0值会持续一段时间,而两个波谷之间可能存在多个次波峰,现在需要找到每个主波峰,也就是要找到两段值为0之间所有值的的最大值。

补充,当y值大于0认为波形开始上升 ,当y值等于0,认为波波峰结束,通常情况下波峰较窄,持续为0的波谷较宽。

波形图数组举例:

    // 假设您有一个 int 数组存储了波形图int waveform[] = { 0, 0, 1, 7, 5, 10, 9,  6, 0, 0, 0, 0, 7, 1, 9, 20, 18, 5, 0, 0, 3, 2, 0, 0, 0, 0,  0,  0, 0, 0,0, 0, 0,12, 7, 5,  10, 3, 6, 0 };

2 代码实现

要找到相邻两个波谷之间的主波峰的y值和其对应的X坐标,可以遍历数组,当遇到波谷值为0时,开始记录下一个波峰的上升阶段,并找到这个阶段的最大值作为主波峰。

#include <iostream>
#include <vector>struct Peak {int i; // i下标int y; // 波峰的y值
};std::vector<Peak> findPeaks(int* waveform, int size) {std::vector<Peak> peaks;int maxVal = 0;int maxIdx = 0;bool inPeak = false;for (int i = 0; i < size; ++i) {if (waveform[i] == 0) {//下降沿遇到0,波峰结束if (inPeak) {// 找到了一个波谷,将上一个波峰信息存储起来Peak peak;peak.i = maxIdx;peak.y = maxVal;peaks.push_back(peak);inPeak = false;}}else {if (!inPeak && waveform[i] > 0) {//直到y值> 0,认为波峰出现// 波形开始上升,开始记录波峰maxVal = waveform[i];maxIdx = i;inPeak = true;}else if (inPeak && waveform[i] > maxVal) {// 上升过程中更新最大值和对应的索引maxVal = waveform[i];maxIdx = i;}}}return peaks;
}int main() {// 假设您有一个 int 数组存储了波形图int waveform[] = { 0, 0, 1, 7, 5, 10, 9,  6, 0, 0, 0, 0, 7, 1, 9, 20, 18, 5, 0, 0, 3, 2, 0, 0, 0, 0,  0,  0, 0, 0,0, 0, 0,12, 7, 5,  10, 3, 6, 0 };// 找到主波峰std::vector<Peak> foundPeaks = findPeaks(waveform, sizeof(waveform) / sizeof(waveform[0]));// 打印找到的主波峰for (const auto& peak : foundPeaks) {std::cout << "下标 i: " << peak.i << ", 主波峰的y值 : " << peak.y << std::endl;}return 0;
}

找到了4个波峰
在这里插入图片描述

http://www.dtcms.com/a/318295.html

相关文章:

  • 【AI总结】python连接MySQL(5)- 高级数据库配置与连接器设计
  • go语言变量2
  • 开疆智能ModbusTCP转Profinet网关连接安川YRC1000机器人配置案例
  • 嵌入式处理器指令系统:精简指令集RISC与复杂指令集CISC的简介,及区别
  • Cervantes:面向渗透测试人员和红队的开源协作平台
  • 勇芳字体查看器 v1.0 免费版
  • 当前就业形势下,软件测试工程师职业发展与自我提升的必要性
  • Kubesphere搜索镜像问题
  • 深度解析|资源位管理工具如何重构媒体商业化效率?
  • 飞书对接E签宝完整方案
  • AI浪潮下,FPGA如何实现自我重塑与行业变革
  • 动态代理常用的两种方式?
  • 开发教育全链路管理系统 + 微信小程序,为各类教育主体注入数字化动力!
  • LeetCode 面试经典 150_数组/字符串_O(1)时间插入、删除和获取随机元素(12_380_C++_中等)(哈希表)
  • Conda虚拟环境安装包
  • 信号处理:信号产生
  • 2025年WiFi技术白皮书:全球物联网无线通信的关键创新
  • Codeforces Round 987 (Div. 2)
  • [特殊字符]海尔考察游学 | 解码人才培养秘籍
  • 长时间面对电脑屏幕需要使用防晒霜吗?
  • js中的 slice、splice、split、substring、substr
  • 面试题:使用class类来写工个五子棋
  • spring-dubbo
  • Post-train 入门(1):SFT / DPO / Online RL 概念理解和分类
  • C++与C语言实现Stack的对比分析
  • sqli-labs通关笔记-第34关POST宽字符注入(单引号闭合 手工注入+脚本注入两种方法)
  • Verilog 仿真问题:打拍失败
  • FPGA学习笔记——VGA简介
  • Excel单元格设置下拉框、选项背景
  • 20250806给PRO-RK3566开发板在Buildroot系统下扩大rootfs分区2GB