当前位置: 首页 > news >正文

【研发日记】Matlab/Simulink软件优化(三)——利用NaNFlag为数据处理算法降阶

文章目录

前言

背景介绍

初始算法

优化算法

分析和应用

总结


前言

        见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》

        见《【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法》

背景介绍

        在一个嵌入式软件开发项目中,需要开发一个数据处理算法,功能是求解一个动态变化数组的平均值、极值和极值位号,并且具备动态剔除个别元素(元素序列不变)的功能。示例如下:

数组:2、4、6、8、10

剔除:第1个元素、第3个元素

求均值:(4 + 8 + 10)/ 3 = 7.3

求最小值:4

求最小值位号:2

求最大值:10

求最大值位号:5

初始算法

        一开始算法开发的思路非常简单,就是根据上述示例把求解过程拆分成两步,第一步构建剔除特定元素后的新数组,第二步分别求解统计结果,示例如下:

        以上模型生成的代码如下:

#include "untitled.h"
#include "untitled_private.h"/* External outputs (root outports fed by signals with default storage) */
ExtY_untitled_T untitled_Y;/* Real-time model */
static RT_MODEL_untitled_T untitled_M_;
RT_MODEL_untitled_T *const untitled_M = &untitled_M_;/* Model step function */
void untitled_step(void)
{real_T Array_min[5];real_T ArrayIndex;int32_T b_idx;int32_T b_k;int32_T e_k;int32_T i;/* MATLAB Function: '<Root>/MATLAB Function' incorporates:*  Constant: '<Root>/Constant'*/for (i = 0; i < 5; i++) {Array_min[i] = untitled_ConstP.Constant_Value[i];}Array_min[0] = 255.0;Array_min[2] = 255.0;untitled_Y.Out2 = 255.0;b_idx = 1;for (b_k = 1; b_k + 1 < 6; b_k++) {if (untitled_Y.Out2 > Array_min[b_k]) {untitled_Y.Out2 = Array_min[b_k];b_idx = b_k + 1;}}for (i = 0; i < 5; i++) {Array_min[i] = untitled_ConstP.Constant_Value[i];}Array_min[0] = 0.0;Array_min[2] = 0.0;untitled_Y.Out4 = 0.0;b_k = 1;for (i = 1; i + 1 < 6; i++) {if (untitled_Y.Out4 < Array_min[i]) {untitled_Y.Out4 = Array_min[i];b_k = i + 1;}}for (i = 0; i < 5; i++) {Array_min[i] = 0.0;}ArrayIndex = 0.0;for (i = 0; i < 5; i++) {if ((i + 1 != 1) && (i + 1 != 3)) {ArrayIndex++;Array_min[(int32_T)ArrayIndex - 1] = untitled_ConstP.Constant_Value[i];}}if (1.0 > ArrayIndex) {i = -1;} else {i = (int32_T)ArrayIndex - 1;}if ((int8_T)(i + 1) == 0) {ArrayIndex = 0.0;} else if ((int8_T)(i + 1) == 0) {ArrayIndex = 0.0;} else {ArrayIndex = Array_min[0];for (e_k = 2; e_k <= (int8_T)(i + 1); e_k++) {ArrayIndex += Array_min[e_k - 1];}}/* Outport: '<Root>/Out1' incorporates:*  MATLAB Function: '<Root>/MATLAB Function'*/untitled_Y.Out1 = ArrayIndex / (real_T)(int8_T)(i + 1);/* Outport: '<Root>/Out3' incorporates:*  MATLAB Function: '<Root>/MATLAB Function'*/untitled_Y.Out3 = b_idx;/* Outport: '<Root>/Out5' incorporates:*  MATLAB Function: '<Root>/MATLAB Function'*/untitled_Y.Out5 = b_k;
}/* Model initialize function */
void untitled_initialize(void)
{/* (no initialization code required) */
}/* Model terminate function */
void untitled_terminate(void)
{/* (no terminate code required) */
}

        上述代码仿真运行没有什么问题,从结果来看是符合功能需求的,示例如下:

        分析上述代码会发现构建新数组时存在一些问题。如果数组中出现大于255的值,或者小于0的负数时,算法就需要重新匹配。如果数组的Size大于5,或者剔除的个数大于2,算法也需要重新匹配。这种繁复的工作,是我们不希望看到的。

优化算法

        针对上述问题的分析和研究,发现Matlab官方提供了一个现成的函数功能,可用于剔除特定元素的数据统计算法,能让我们简化构建新数组的工作,也就免去繁复匹配算法的问题,示例如下:

        Tips:因为有NaN的存在,数组的数据类型如果不是double可能会出问题。例如NaN赋给uint8的数组是,对应元素就会变成0,再后续的求解函数中是按0对待的。

        以上模型生成的代码如下:

#include "untitled.h"
#include "untitled_private.h"/* External outputs (root outports fed by signals with default storage) */
ExtY_untitled_T untitled_Y;/* Real-time model */
static RT_MODEL_untitled_T untitled_M_;
RT_MODEL_untitled_T *const untitled_M = &untitled_M_;/* Model step function */
void untitled_step(void)
{real_T data[5];real_T y;int32_T c_k;int32_T i;int32_T k;boolean_T exitg1;/* MATLAB Function: '<Root>/MATLAB Function' incorporates:*  Constant: '<Root>/Constant'*/for (i = 0; i < 5; i++) {data[i] = untitled_ConstP.Constant_Value[i];}data[0] = (rtNaN);data[2] = (rtNaN);i = 0;k = 2;exitg1 = false;while ((!exitg1) && (k < 6)) {if (!rtIsNaN(data[k - 1])) {i = k;exitg1 = true;} else {k++;}}if (i == 0) {/* Outport: '<Root>/Out2' */untitled_Y.Out2 = (rtNaN);i = 1;} else {untitled_Y.Out2 = data[i - 1];for (k = i; k < 5; k++) {if (untitled_Y.Out2 > data[k]) {untitled_Y.Out2 = data[k];i = k + 1;}}}k = 0;c_k = 2;exitg1 = false;while ((!exitg1) && (c_k < 6)) {if (!rtIsNaN(data[c_k - 1])) {k = c_k;exitg1 = true;} else {c_k++;}}if (k == 0) {/* Outport: '<Root>/Out4' */untitled_Y.Out4 = (rtNaN);k = 1;} else {untitled_Y.Out4 = data[k - 1];for (c_k = k; c_k < 5; c_k++) {if (untitled_Y.Out4 < data[c_k]) {untitled_Y.Out4 = data[c_k];k = c_k + 1;}}}y = 0.0;c_k = 0;if (!rtIsNaN(data[1])) {y = data[1];c_k = 1;}if (!rtIsNaN(data[3])) {y += data[3];c_k++;}if (!rtIsNaN(data[4])) {y += data[4];c_k++;}/* Outport: '<Root>/Out1' incorporates:*  MATLAB Function: '<Root>/MATLAB Function'*/untitled_Y.Out1 = y / (real_T)c_k;/* Outport: '<Root>/Out3' incorporates:*  MATLAB Function: '<Root>/MATLAB Function'*/untitled_Y.Out3 = i;/* Outport: '<Root>/Out5' incorporates:*  MATLAB Function: '<Root>/MATLAB Function'*/untitled_Y.Out5 = k;
}/* Model initialize function */
void untitled_initialize(void)
{/* Registration code *//* initialize non-finites */rt_InitInfAndNaN(sizeof(real_T));
}/* Model terminate function */
void untitled_terminate(void)
{/* (no terminate code required) */
}

        Tips:从生成的C代码来看,底层逻辑的实现方法与前一种是类似的

        上述代码仿真运行也没有问题,结果符合需求,示例如下:

        分析上述算法的特点,不仅实现了项目中的需求,同时也利用NaNFlag为数据处理算法进行了降阶

分析和应用

        利用NaNFlag开发数据处理算法时,需要注意如下几点:

        1、两种算法生成的代码,底层逻辑都一样,但是是开发复杂度软件成熟度上差别好多,前者更适合用于逻辑探索和思维训练,后者跟适合于工程应用

        2、两种算法的开发自由度不同,可裁剪和压缩负载的空间也不同。前者可以根据实际应用裁剪出自己需要的数组大小,选取自己够用的数据类型,能更极致压缩算法对内存资源算力资源的消耗。后者是把一部分算法设计工作交给代码生成工具去做了,开发者就没有这么大的灵活度了。前者更适用于处理器资源有限的专用嵌入式项目,后者更实用于模块化平台化开发的项目。

总结

        以上就是本人在嵌入式软件开发中设计数据处理算法时,一些个人理解和分析的总结,首先介绍了它的背景情况,然后展示它的初始设计和优化设计,最后分析了利用NaNFlag开发数据处理算法的注意事项和应用场景。

        后续还会分享另外几个最近总结的软件优化知识点,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。


        版权声明:原创文章,转载和引用请注明出处和链接,侵权必究

相关文章:

【研发日记】Matlab/Simulink软件优化(三)——利用NaNFlag为数据处理算法降阶

文章目录 前言 背景介绍 初始算法 优化算法 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 见《【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法》 背景介绍 在一个嵌入式软件开发项目中&#xff0c;需要开…...

go语言接口之http.Handler接口

package httptype Handler interface {ServeHTTP(w ResponseWriter, r *Request) }func ListenAndServe(address string, h Handler) error ListenAndServe函数需要一个例如“localhost:8000”的服务器地址&#xff0c;和一个所有请求都可以分 派的Handler接口实例。它会一直运…...

R语言 | 使用最简单方法添加显著性ggpubr包

本期教程原文&#xff1a;使用最简单方法添加显著性ggsignif包 本期教程 获得本期教程代码和数据&#xff0c;在后台回复关键词&#xff1a;20240605 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游…...

【Linux】shell脚本变量——系统变量、环境变量和用户自定义变量

系统变量 系统变量是由系统预设的&#xff0c;它们通常在系统启动时被加载&#xff0c;并对所有用户和所有shell实例都有效。这些变量通常控制着系统的行为和配置&#xff0c;例如PATH&#xff08;命令搜索路径&#xff09;、HOME&#xff08;用户主目录&#xff09;等。系统变…...

QWidget 属性——windowTitle·windowIcon·qrc

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、windowTitle二、windowIcon三、qrc 一、windowTitle windowTitle 是一个通常用于表示窗口标题…...

深入理解rtmp(一)之开发环境搭建

深入理解rtmp(一)之开发环境搭建 手机直播在15年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的CDN厂商牢牢占据,后面大家又把精力投…...

java常用面试基础题

&与&&区别&#xff1f; &和&&都是逻辑运算符&#xff0c;都是判断两边同时真则为真&#xff0c;否则为假&#xff1b;但是&&当第一个条件不成之后&#xff0c;后面的条件都不执行了&#xff0c;而&则还是继续执行&#xff0c;直到整个条件…...

互联网摸鱼日报(2024-06-11)

互联网摸鱼日报(2024-06-11) 36氪新闻 雅诗兰黛&#xff0c;胆子也太大了 苹果WWDC终极前瞻&#xff1a;5大看点20大AI新功能&#xff0c;库克不能输的一战 瑞士清洁科技公司Enerdrape开发预制地热板&#xff0c;回收城市地下空间的浅层地热能和废热用于建筑物制热或制冷 | …...

中介子方程十二

X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XVXpX$XyXtXkXrXiXα…...

SLT简介【简单介绍SLT】

SLT简介 在c的学习当中STL的学习是一个很重要的一环&#xff0c;但是STL又是一个庞大的章节&#xff0c;因此这里我们先简单介绍一下STL&#xff0c;有助于后面我们对STL的学习&#xff0c;这里就是做一个简单的介绍&#xff0c;并无干货。 1.什么是STL STL(standard templa…...

vue实现pdf下载——html2canvas

html2canvas 官方文档https://html2canvas.hertzen.com/getting-started html2canvas 的原理是通过遍历DOM树,将每一个HTML元素转化为Canvas对象,并叠加到一起形成一张完整的图片或者PDF文件。 1. 安装插件 npm install html2canvas jspdf --save 2.使用&#xff08;页面已经…...

安装docker+mysql的一些坑

yum -y install docker 提示missing signature 参考这里 https://www.8a.hk/news/content/8235.html 卸载旧的docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装…...

React Native采集数据离线存储、网络状态监控、加密上传、鉴权

在无网络环境下进行数据采集并在有网络时上传至服务器&#xff0c;同时确保数据的鉴权和加密&#xff0c;这一需求需要考虑多方面的实现细节。无论您选择原生开发还是使用React Native&#xff08;甚至Expo&#xff09;&#xff0c;以下是如何实现这一需求的具体步骤和建议。 …...

网络数据库后端相关面试题(其三)

18&#xff0c; 传输控制协议tcp和用户数据报协议udp有哪些区别 第一&#xff0c;tcp是面向字节流的&#xff0c;基本的传输单位是tcp报文段&#xff1b;而udp是面向报文的&#xff0c;基本传输单位是用户数据报。 第二&#xff0c; tcp注重安全可靠性&#xff0c;连接双方在…...

Hadoop之HDFS分布式文件系统

HDFS简介 Hadoop Distributed File System (HDFS): HDFS 是 Hadoop 的分布式文件系统,它设计用于存储大量数据,并提供 高吞吐率的数据访问,通过将数据分块存储在多个节点上,实现数据的冗余存储和容错。 HDFS重要概念 HDFS 通过统一的命名空间目录树来定位文件; 另外,它…...

插入删除单链表指定结点-偷天换日法

王道说下面的代码有BUG&#xff0c;比如当删除的结点p在最后一个元素时&#xff0c;p->nextNULL; So *q NULL; q->data就是错误的&#xff0c;我认为加个判断就行 加个判断即可 /*看着是删除q了&#xff0c;从结果上看就是把p删除了 偷天换日法*/ bool DeleteNode(LNod…...

MybatisPlus代码生成器使用案例

针对数据库中的实体类表&#xff0c;自动生成相关的pojo类&#xff0c;mapper&#xff0c;service等 1. Get-Started 基于mybatisplus&#xff0c;idea下载mybatisplus插件 sql文件 /*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */; /*!40101 SET NAMES utf8 …...

数学公式编辑器(前端预研)

数学公式输入wangeditor&#xff1a; vue2使用wangeditor实现数学公式和富文本编辑器 mathjax文档&#xff1a;MathJax: 让前端支持数学公式 mathjax识别数学公式vue中使用mathjax识别latex数学公式 数学公式编辑器&#xff1a;&#xff08;少&#xff09; https://github.com…...

架构设计-如何安全地传输密码

java web 项目中经常会遇到登录或注册的场景,如果查看浏览器的 network 网络请求时,用户的密码以明文方式传输,会造成很多安全隐患,这就涉及到密码如何安全传输的问题。 数据加密的重要性不言而喻,通用的加密技术有 哈希散列、对称加密、非对称加密。 哈希散列 哈希散列是…...

【库】nprogress 顶部进度条

yarn add nprogress router文件 前置路由添加启动 后置路由添加关闭 router.beforeEach((to, from, next) > { NProgress.start() next() }) router.afterEach(() > { NProgress.done() }) App.vue 文件 引入样式 <script setup> import "nprogress/npro…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...