双阈值最大最小值筛选
问题:
如下图所示的问题,给定最小阈值、最大阈值以及一段数据队列,对数据队列中超过阈值部分的极值进行保存,即从队列中得到P1-P6
计算规则
规则类似状态机
首先定义last_type标志位:
{ 上一时刻大于 m a x _ t h : l a s t t y p e = 1 上一时刻在 m a x _ t h 和 m i n _ t h 之间 : l a s t t y p e = 0 上一时刻小于 m i n _ t h : l a s t t y p e = − 1 \left\{ \begin{array}{l} 上一时刻大于max\_th : last_type = 1 \\ 上一时刻在max\_th和min\_th之间 : last_type = 0 \\ 上一时刻小于min\_th : last_type = -1 \\ \end{array} \right. ⎩ ⎨ ⎧上一时刻大于max_th:lasttype=1上一时刻在max_th和min_th之间:lasttype=0上一时刻小于min_th:lasttype=−1
定义存储数据为最终返回的数据data
规则
{ 不符合阈值直接 l 略过 如果当前为 d a t a 是空 − 直接放入 d a t a 如果 d a t a 最后数据 l a s t _ t y p e 为 − 1 并且当前大于阈值直接放入 d a t a 如果 d a t a 最后数据 l a s t _ t y p e 为 1 并且当前大于阈值 d a t a b a c k = m a x ( d a t a b a c k , 当前值 ) 如果 d a t a 最后数据 l a s t _ t y p e 为 − 1 并且当前小于阈值 d a t a b a c k = m i n ( d a t a b a c k , 当前值 ) 直接放入 d a t a 如果 d a t a 最后数据 l a s t _ t y p e 为 1 并且当前小于阈值直接放入 d a t a \left\{\begin{array}{l} 不符合阈值直接l略过 \\ 如果当前为data是空-直接放入data \\ 如果data最后数据last\_type为-1并且当前大于阈值直接放入data \\ 如果data最后数据last\_type为1并且当前大于阈值data_back = max(data_back,当前值) \\ 如果data最后数据last\_type为-1并且当前小于阈值data_back = min(data_back,当前值)直接放入data \\ 如果data最后数据last\_type为1并且当前小于阈值直接放入data \end{array} \right. ⎩ ⎨ ⎧不符合阈值直接l略过如果当前为data是空−直接放入data如果data最后数据last_type为−1并且当前大于阈值直接放入data如果data最后数据last_type为1并且当前大于阈值databack=max(databack,当前值)如果data最后数据last_type为−1并且当前小于阈值databack=min(databack,当前值)直接放入data如果data最后数据last_type为1并且当前小于阈值直接放入data
代码
#include "iostream"
#include "deque"
#include "vector"
#include "math.h"
// 搜索最值using namespace std;// 寻找周期的最大值最小值
class FindMM
{
private:double max_th;double min_th;deque<double> mDataQue;public:FindMM(double _max_th, double _min_th){max_th = _max_th;min_th = _min_th;}~FindMM(){}int last_type = 0;int type(double _data){if(_data < min_th) return -1;if(_data >= min_th && _data <= max_th) return 0;return 1;}void push_back(double _data){if(_data >= min_th && _data <= max_th){return;}if(last_type == 0){mDataQue.push_back(_data);last_type = type(_data);return;}// 大于情况if(_data > max_th && (last_type == -1)){mDataQue.push_back(_data);last_type = type(_data);return;}if(_data > max_th && (last_type == 1)){if(_data > mDataQue.back()){mDataQue.back() = _data;}return;}// 小于情况if(_data < min_th && (last_type == 1)){mDataQue.push_back(_data);last_type = type(_data);return;}if(_data < min_th && (last_type == -1)){if(_data < mDataQue.back()){mDataQue.back() = _data;}return;}}void print(){for(int i = 0; i < mDataQue.size(); ++i){std::cout << mDataQue[i] << " ";}std::cout << std::endl;}
};int main(void){int max_th = 1;int min_th = -1;FindMM finder(max_th, min_th);vector<double> fuction;for(double i = 0; i < 10; i += 0.2){fuction.push_back(sin(i)*2);std::cout << fuction.back() << " ";}std::cout << std::endl;for(int i = 0; i < fuction.size(); ++i){finder.push_back(fuction[i]);}finder.print();return 0;
}