首页 > 编程语言 >C# 一个简单的连续心率血氧压缩算法

C# 一个简单的连续心率血氧压缩算法

时间:2024-11-29 15:45:24浏览次数:6  
标签:count return 血氧 val C# yield 数值 byte 压缩算法

自己写的一个简单的压缩算法,但是由于数据源无法保证数据的连续性,和Gzip对比后失去优势,因此最终弃用了,扔了可惜,发布上来看看之后能否用到

    /// <summary>
    /// 心率数据压缩算法,数据特点:
    /// 1,可以用一个字节表示;
    /// 2,数值不为0;
    /// 3,存在大量连续重复的数值
    /// 具体算法:对于连续相同超过2个的数值,后面用三个数值表示,第一个数值固定为0,第二个为该数值,第三个为重复的个数(最大255),
    /// 该算法比较适合每秒心率,血氧之类连续重复性强变化缓慢的的生理数据
    /// </summary>
    public class HRCompressor {
        /// <summary>
        /// 压缩
        /// </summary> 
        public static IEnumerable<byte> Compress(IEnumerable<byte> values) {
            foreach ((byte val, byte count) in CutSegment(values)) {
                if (count == 1) {
                    yield return val;
                } else if (count == 2) {
                    yield return val;
                    yield return val;
                } else if (count > 2) {
                    yield return 0;
                    yield return val;
                    yield return count;
                }
            }
        }
        /// <summary>
        /// 按照连续相同的数值进行分段
        /// </summary>
        static IEnumerable<(byte, byte)> CutSegment(IEnumerable<byte> values) {
            byte prev = 0;
            byte count = 0;
            foreach (var p in values) {
                if (p == 0) {
                    throw new Exception("该压缩算法中数值不能为0");
                }
                if (count > 0 && p != prev) {  //非第一次连续的2个数值不相等
                    yield return (prev, count); //返回数值,及其连续的个数
                    count = 0;
                }
                if (count == byte.MaxValue) { //超过最大计数后,返回结果
                    yield return (prev, count);
                    count = 0;
                }
                prev = p;
                count++;
            }
            yield return (prev, count);
        }
        /// <summary>
        /// 解压缩
        /// </summary> 
        public static IEnumerable<byte> Decompress(IEnumerable<byte> values) {
            byte step = 0;
            byte val = 0;
            foreach (var p in values) {
                if (p == 0) { //发现为0后,就说明后续的2个字节,一个是数值,一个是个数
                    step = 2;
                } else {
                    if (step == 2) {
                        val = p;
                        step = 1;
                    } else if (step == 1) {
                        for (int i = 0; i < p; i++) {
                            yield return val; //返回指定个数的相同数值
                        }
                        step = 0;
                        val = 0;
                    } else {
                        yield return p;
                    }
                }
            }
        }
    }

 

标签:count,return,血氧,val,C#,yield,数值,byte,压缩算法
From: https://www.cnblogs.com/luludongxu/p/18576863

相关文章

  • pip 下载包失败(特定版本eg: torch==2.2.1+cu118)
    背景介绍:有时候要复现其项目的实验时,环境需要尽量与原作者实验的环境靠近,这样结果浮现的也更加准确。这里当需要安装torch==2.2.1+cu118等特定版本的时,出现了报错:解决办法:根据PyTorch官方推荐,可以使用以下命令来安装torch2.2.1+cu118版本pipinstalltorch==2.2.1t......
  • 新版PC端朋友圈自动点赞工具——秒赞功能上线
    对于频繁需要互动、保持社交活跃的用户来说,手动逐一点赞不仅耗时,而且容易产生疲劳。为了解决这一痛点,PC端朋友圈自动点赞工具在原有的基础上进行了优化和升级,新增了秒赞功能,极大地提升了点赞效率。本篇文章将详细介绍新版工具的秒赞功能,并分享使用体验。 官网(http://aisisoft.top......
  • 10C++选择结构(4)——教学
    一、switch语句(第25课成绩等级)问题:风之巅小学规定,若测试成绩大于或等于90分为“A”,大于或等于70分小于90分为“B”,大于或等于60分小于70分为“C”,60分以下为“D”。试编一程序,输入一个成绩,输出它的等级。流程图如下:用if语句处理多个分支时需使用if-else-if结构,分支越多,嵌套......
  • agent introduced in Cursor v0.43
    InthelatestCursorIDE,AgentsintheComposerpanelarecustomizableAIassistantsthatcanbeconfiguredforspecifictasks.Here'sabreakdown:WhatAgentsAre:SpecializedAIassistantswithdefinedbehaviorsCanbecustomizedforspecificp......
  • 新手必看——ctf六大题型介绍及六大题型解析&举例解题
    CTF(CaptureTheFlag)介绍与六大题型解析一、什么是CTF?CTF(CaptureTheFlag),意为“夺旗赛”,是一种信息安全竞赛形式,广泛应用于网络安全领域。CTF竞赛通过模拟现实中的网络安全攻防战,让参赛者以攻防对抗的形式,利用各种信息安全技术进行解决一系列安全问题,最终获得“旗帜(Flag)”......
  • 自定义一个WinForm个性化的TabControl
    系列文章目录第一章自定义一个WinForm异形按钮第二章自定义一个WinForm圆角文本框第三章自定义一个WinForm个性化的TabControl文章目录系列文章目录前言一、效果展示自定义TabControl效果展示二、TabControl自定义1.创建一个MyTabControl2.自定义并暴露出一些常......
  • TypeScript核心语法(3)——类型系统
    本章是TypeScript类型系统的总体介绍。TypeScript继承了JavaScript的类型,在这个基础上,定义了一套自己的类型系统。先讲一下最基础的类型,any类型。any类型​基本含义​any类型表示没有任何限制,该类型的变量可以赋予任意类型的值。letx:any;x=1;//正确x=......
  • Linux驱动开发之LCD显示和触摸
    目录LCD屏幕显示LCD相关参数FramebufferDRM驱动框架LCD屏幕触摸MT协议LCD屏幕显示LCD(LiquidCrystalDisplay),即液晶显示器,是一种数显技术,可以通过液晶和彩色过滤器过滤光源并在平面板上产生图像,是现在最常用到的显示器。而液晶本身不能发光,只能通过对光线的穿透和反......
  • 【SpringCloud】Consul——服务注册与发现
    consul基础知识Consul是什么?Consul是一款开源的分布式服务发现与配置管理系统,由HashiCorp公司使用Go语言开发。官网地址:https://www.consul.io/,下载地址:https://developer.hashicorp.com/consul/install?product_intent=consulConsul能做什么服务发现:提供HTTP和DNS两种发现......
  • LLM大模型: CV领域常见attention思路变种及其作用(一)
    多年前做传统的机器学习,主要用的是LR、SVM、bayes、浅层nerualnetwork、decisiontree、randomforest、GBDT等,这些分类或回归模型要想AUC、ROC等指标高,最核心的就是构造特征了!为此还专门诞生了一个细分领域:featherenginering,专门研究怎么构造好的feather!就实战情况而言,换模......