【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个波峰