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

标签 c++ arrays signals blob

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

我正在用 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: 1
Peak at: 91
Peak at: 1
Peak at: 2
Peak at: 89
Peak at: 79
Peak at: 1

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

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

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

相关文章:

C 使用函数计算阶乘

c++ - 安全跨线程信号/槽 C++

c++ - Qt 信号和插槽 - 没有任何反应

c++ - 为什么 ZeroMQ 不使用其内部线程等待(接收/发送)?

c++ - 在 C++ 中获取操作系统版本的最佳跨平台方式

Java 二维颜色数组。是否可以?

matlab - 如何制作一个遵循某种趋势的向量?

c++ - C++ 如何区分对全局变量的调用和全局变量的声明?

c++ - 录制音频,存储在缓冲区中,然后通过 PulseAudio 将字节写入声卡

sql - PostgreSQL:获取数组中指定元素的出现次数