双阈值最大最小值筛选

问题:

如下图所示的问题,给定最小阈值、最大阈值以及一段数据队列,对数据队列中超过阈值部分的极值进行保存,即从队列中得到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_thmin_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_type1并且当前大于阈值直接放入data如果data最后数据last_type1并且当前大于阈值databack=max(databack,当前值)如果data最后数据last_type1并且当前小于阈值databack=min(databack,当前值)直接放入data如果data最后数据last_type1并且当前小于阈值直接放入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;
}
  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值