抗噪声最大最小值筛选

news2024/9/25 3:28:28

问题

在如下图所示包含一些噪声的数据队列中如何可以把绿色的(有一个点图片上忘记标了)几个主观认为的最大值最小值筛选出来

在这里插入图片描述

思路

简述:定义一个噪声阈值,如果当前比上一次超过噪声阈值才进行更新,如果当前比上一次的变化没超过噪声值记录下来,等到需要更新的时候再进行替换。
状态变量:status
{ − 1 = 处于下降趋势中 0 = 相等情况 1 = 处于上升 v 趋势中 \left\{ \begin{array}{l} -1 = 处于下降趋势中\\ 0 =相等情况\\ 1 = 处于上升v趋势中 \\ \end{array} \right. 1=处于下降趋势中0=相等情况1=处于上升v趋势中
处理逻辑:
{ 队列为空:直接放进去第一个数据 不为空且增量大于更新阈值 { s t a t u s = 0 直接放进去并标记趋势 s t a t u s = 1 说明一直处于增量序列中直接替换尾部最大值并更新上一时刻保存量 s t a t u s = − 1 说明处于下降序列到上升序列的交替点,更新最小值加入上升序列值并更新 s t a t u s 不为空且增量小于更新阈值:根据定义的 s t a t u s 趋势对应保存到上一时刻保存量中 \left\{ \begin{array}{l} 队列为空:直接放进去第一个数据 \\ 不为空 且 增量大于更新阈值 \left\{ \begin{array}{l} status = 0直接放进去并标记趋势 \\ status = 1说明一直处于增量序列中直接替换尾部最大值并更新上一时刻保存量\\ status = -1说明处于下降序列到上升序列的交替点,更新最小值加入上升序列值并更新status \end{array} \right.\\ 不为空且增量小于更新阈值:根据定义的status趋势对应保存到上一时刻保存量中 \end{array} \right. 队列为空:直接放进去第一个数据不为空且增量大于更新阈值 status=0直接放进去并标记趋势status=1说明一直处于增量序列中直接替换尾部最大值并更新上一时刻保存量status=1说明处于下降序列到上升序列的交替点,更新最小值加入上升序列值并更新status不为空且增量小于更新阈值:根据定义的status趋势对应保存到上一时刻保存量中

代码

#include "iostream"
#include "deque"
#include "math.h"
#include "random"


using namespace std;

// 抗噪声的最大值最小值队列
class Anti_Noise_MM_Que
{
public:
    double m_noise = 0.15;    // 噪声大小
    deque<double> m_que;
    double last_value;        // 上一时刻的值
    int status = 0;           // 切换状态标志位 如果为0则为一样(初始状态) 1是找最大(上一时刻是MAX) -1是找最小(上一时刻是找MIN)
public:

    Anti_Noise_MM_Que(double _noise){
        m_noise = _noise;
    }
    ~Anti_Noise_MM_Que(){

    }
    // 加入队列
    void push_back(double _data){
        // 为空的情况
        if (m_que.empty()){
            m_que.push_back(_data);
            last_value = _data;
            status = 0;
            return;
        }
        // 不为空 且 大于更新阈值的情况
        if (abs(_data - m_que.back()) > m_noise){
            if(status == 0){            // 上一时刻一样(大概率初始状态)
                if(_data - m_que.back() > 0){// 上升趋势
                    m_que.push_back(_data);
                    status = 1;
                }else{                       // 下降趋势
                    m_que.push_back(_data);
                    status = -1;
                }
                last_value = _data;
            }
            else if(status == -1){      // 上一时刻小
                if(_data - m_que.back() > 0){// 上升趋势
                    // 更新最值
                    m_que.back() = min(last_value, m_que.back());
                    m_que.push_back(_data);
                    last_value = _data;
                    status = 1;
                }else{                       // 下降趋势
                    // 替换最值
                    m_que.back() = _data;
                    last_value = _data;
                }
            }else{                      // 上一时刻大
                if(_data - m_que.back() > 0){// 维持上升趋势
                    // 替换最值
                    m_que.back() = _data;
                    last_value = _data;
                }else{                       // 变为下降趋势
                    // 更新最值
                    m_que.back() = max(last_value, m_que.back());
                    m_que.push_back(_data);
                    last_value = _data;
                    status = -1;
                }
            }
        }
        // 不为空 且 小于更新阈值的情况
        else{
            if(status == 0){
                last_value = _data;
            }else if(status == -1){// 下降趋势
                last_value = min(last_value, _data);
            }else{// 上升趋势
                last_value = max(last_value, _data);
            }
        }
    }
    // 出队列

};




int main(void){


    // 进行测试
    vector<double> test_vec;

    random_device rnd; 
	mt19937 rng(rnd());
    normal_distribution<double> gaosi(0,1);

    for(double i = 0; i < 10; i += 0.08){
        double noise = gaosi(rng) * 0.1;
        double num = sin(i) + noise;
        test_vec.push_back(num);
		cout << num << " ";
	}
    cout << endl;

    // 测试
    Anti_Noise_MM_Que anMMq(0.3);
    for(int i = 0; i < test_vec.size(); ++i){
        anMMq.push_back(test_vec[i]);
    }

    // 打印
    for(int i = 0; i < anMMq.m_que.size(); ++i){
        std::cout << anMMq.m_que[i] << " ";
    }
    std::cout << endl;

    return 0;
}

结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双11订单实时大屏 - Flink实战洞见

每年的双11购物狂欢节不仅是消费者的狂欢&#xff0c;更是技术人员展示实力的舞台。在这个全民关注的时刻&#xff0c;如何实现实时、准确、鲜活的订单数据展示&#xff0c;成为了各大电商平台技术竞技的焦点。本文将深入探讨如何利用Apache Flink构建一个面向双11的订单实时大…

软件设计原则 KISS、YAGNI、DRY

软件设计原则 KISS、YAGNI、DRY flyfish 设计模式、设计原则与编程惯用法综述 图片来源SpaceX 简约至极的猛禽3(Raptor 3)火箭发动机 一、KISS (Keep It Simple, Stupid!, 保持简单) KISS原则&#xff0c;即“Keep it simple, stupid!”&#xff08;保持简单&#xff0c;傻…

鸿蒙(API 12 Beta3版)【AVCodec Kit简介】 音视频编码服务

AVCodec kit&#xff08;Audio & Video Codec Kit&#xff0c;音视频编解码&#xff0c;封装解封装原子能力&#xff09;是媒体系统中的音视频的编解码、媒体文件的解析、封装、媒体数据输入等原子能力。 能力范围 媒体数据输入&#xff1a;媒体应用可以传入文件fd、或者…

力扣面试150 反转链表 II 三指针

Problem: 92. 反转链表 II &#x1f468;‍&#x1f3eb; 参考题解 特殊情况 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val…

【区块链+医疗健康】健康管理平台 | FISCO BCOS应用案例

如今&#xff0c;医疗数据的共通共享依然存在一些难点&#xff1a; 1. 数据碎片化&#xff0c;分散在各个机构和公司&#xff0c;难以整合和共享。 2. 数据不完整&#xff0c;缺乏全面的患者信息&#xff0c;导致决策质量下降。数据的可扩展性不足&#xff0c;难以长期跟踪患…

“Mutation Observer:让DOM变化尽在掌握

Mutation Observer&#xff08;变动观察者&#xff09; 定义 Mutation Observer是一种JavaScript API&#xff0c;用于异步监测DOM树的变动&#xff0c;包括元素的添加、删除、属性变化等。当DOM发生变动时&#xff0c;它可以触发回调函数&#xff0c;允许你对变动作出响应。 …

Ubuntu14.04安装网卡驱动

1&#xff0c;lspci 查看网卡型号 2,到官网下载解压&#xff0c;进入文件目录 3,新装的服务器会报错&#xff0c;提示我们没有安装make&#xff0c;下载缺少的gcc和make依赖&#xff0c;记得先执执行一下系统更新 sudo apt update && sudo apt upgrade -y sudo apt …

【css】使用CSS绘制奥运五环--巴黎奥运

使用CSS绘制奥运五环 在2024年巴黎奥运会期间&#xff0c;本文来使用 CSS 来画一个奥运五环。奥运五环由五个相互交叠的圆环组成&#xff0c;分别代表五大洲。 奥运五环是相互连接的&#xff0c;因此在视觉上会产生重叠效果&#xff0c;这也是实现五环最有挑战性的部分 HTML结…

Linux -软件包管理 下载与安装方式

1. wget下载 先下载再安装 wget命令是Linux系统用于从Web下载文件的命令行工具&#xff0c;支持 HTTP、HTTPS及FTP协议下载文件 当然现在更多支持用yum工具的&#xff0c;不过有的时候一些镜像站点不再维护一些旧版本的软件时&#xff0c;这时候就可以用wget可以先获取&…

Unity补完计划 之 SpriteEditer Multiple

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1. SpriteEditer Multiple Automatic slicing - Unity 手册 这是用于裁剪图集的模式 应用之后精灵编辑器会看到Slice亮…

CSP-J 复赛 模拟题7 and 解析

1.超级素数&#xff1a; 题目描述 素数&#xff0c;又称质数&#xff0c;是指除 11 和其自身之外&#xff0c;没有其他约数的正整数。例如 2,3,5,132,3,5,13 都是素数&#xff0c;而 4,9,12,184,9,12,18 则不是。特别地&#xff0c;规定 11 不是素数&#xff08;因此自然数的…

【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用

前言&#xff1a; 在C编程语言中&#xff0c;异常处理是一种重要的机制&#xff0c;它允许程序员在运行时捕获和处理错误或异常情况。本文将详细介绍C异常处理的相关知识点&#xff0c;包括异常的定义、抛出与捕获、异常处理的原则、以及在实际编程中的应用。 目录 1. 异常处理…

算法力扣刷题记录 六十九【动态规划基础及509. 斐波那契数】

前言 调整一下做题顺序&#xff0c;多个章节同步进行&#xff0c;穿插练习。可以在各章节的专栏中找同一类。 记录 六十九【动态规划基础】。 一、动态规划理论基础学习 参考学习链接 二、509. 斐波那契数 2.1 题目阅读 斐波那契数 &#xff08;通常用 F(n) 表示&#x…

屏蔽浏览器搜索出csdn相关内容的方法

屏蔽csdn搜索结果的方法 前言 鉴于你对知识质量的渴望&#xff0c;以及对挖掘知识金子的欲求&#xff0c;你一定想在浏览器结果中去除有关Csdn的全部内容&#x1f608;**(确信)**&#xff0c;但是当你在用bing或者google搜索有没有可以屏蔽CSDN搜索结果的方法时&#xff0c;通…

一套基于tailwindcss的后台管理系统模板Chakra UI + React + TS

下载地址给你们&#xff1a; https://horizon-ui.com/#version

算法混合杂项

基础类型 可用template 投影 是有方向的 求俩直线交点 推公式 q我们不知道&#xff0c;已知p1 p2&#xff0c;正弦定理&#xff0c;α可以用叉积表示出来 β同理 所以我们能求出p1q 已知piq 回归到我们上一个问题&#xff0c;已知方向和长度&#xff0c;我们就能够求出Voq …

24/8/8算法笔记 不同分类算法的差异

import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVCfrom sklearn import datasets 加载数据 我们加载的是啤酒的数据 wine datasets.load_wine() wine LR逻辑斯蒂回归…

【数据结构】数组复习-二分查找法

写这篇博客的起因&#xff1a; 刚开始刷力扣&#xff0c;发现没有一个很好的做题方法&#xff0c;在网络上发现了这个博主的评论&#xff0c;如下。感觉挺适合我&#xff0c;所以开始复习一下数据结构。 c基础主要是看&#xff1a; 1.bilibili上青岛大学王卓第02周03--2.3线…

算法 二

求中点 LR&#xff0c;可能溢出 除以2&#xff0c;等同于右移一位 递归、递归的时间复杂度 母问题的规模 子问题的规模&#xff0c;且都相等 调用次数 不用展开看&#xff0c;就看一层。 归并排序 时间复杂度降低的原因&#xff1a;没有浪费比较。比如选择排序&#xff…

48天笔试训练错题——day44

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 单词倒排 选择题 1. A 类 IP 地址&#xff1a;0.0.0.0 ~ 127.255.255.255 1 字节网络号&#xff0c;3 字节主机号 B 类 IP 地址&#xff1a;128.0.0.0 ~ 191.255.255.255 2…