gpt4 book ai didi

c++ - 检测数组中的上升。 (值的密度)

转载 作者:行者123 更新时间:2023-11-28 03:35:59 29 4
gpt4 key购买 nike

我面临挑战,想征求您的建议。

我正在用 c/c++ 编码,我有一个如下所示的数组。

A[40]={0,0,1,0,2,7,18,45,80,85,88,91,88,65,12,3,0,1,0,2,1,2,5,45,88,89,78,79,65,12,5,2,1,0,0,1,0,0,1}

如您所见,有 2 处上升,我们也可以将它们称为曲线。该数组存储实时信号相对于时间的值。它像队列一样工作,并为每个新值刷新自身。

我想检测和计算上升,到目前为止我已经尝试了一些方法但还没有找到一致的解决方案。

我的问题是:如何检测这些曲线并判断数组 A 中有 2 条曲线?

你知道连贯检测它们的好方法吗?或者有没有一种方法或东西来处理这种信号的工作?

我真的需要答案来推进我的项目,所以欢迎您提供所有答案。提前致谢。

最佳答案

您可以通过查找比较相邻值时符号翻转的点来发现数据中的峰值:

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

namespace {
int diff(const int& a, const int& b) {
if (b-a > 0)
return 1;
else if (b-a < 0)
return -1;
return 0;
}
}

int main() {
const int A[]={0,0,1,0,2,7,18,45,80,85,88,91,88,65,12,3,0,1,0,2,1,2,5,45,88,89,78,79,65,12,5,2,1,0,0,1,0,0,1};
std::vector<int> delta;
std::transform(A, A+((sizeof A/sizeof *A) - 1), A+1, std::back_inserter(delta), diff);
for (std::vector<int>::const_iterator it = ++delta.begin(); it != delta.end(); ++it) {
if (*it < 0 && *it != *(it - 1))
std::cout << "Peak at: " << A[it-delta.begin()] << "\n";
}
}

请注意,您的数据中实际上有两个以上的峰值:

Peak at: 1Peak at: 91Peak at: 1Peak at: 2Peak at: 89Peak at: 79Peak at: 1

如果它们不是真正的峰值(只是数据中的噪音),那么您可以通过几种方式解决这个问题:

  1. 数据量化。
  2. 平滑 - 即改变每个值,使其在某种程度上更像它的邻居。
  3. 阈值。不仅要记录符号,还要记录幅度。忽略小于特定大小的更改。

关于c++ - 检测数组中的上升。 (值的密度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10858352/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com