【研发日记】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软件优化(二)——通信负载柔性均衡算法》 背景介绍 在一个嵌入式软件开发项目中,需要开…...
go语言接口之http.Handler接口
package httptype Handler interface {ServeHTTP(w ResponseWriter, r *Request) }func ListenAndServe(address string, h Handler) error ListenAndServe函数需要一个例如“localhost:8000”的服务器地址,和一个所有请求都可以分 派的Handler接口实例。它会一直运…...
R语言 | 使用最简单方法添加显著性ggpubr包
本期教程原文:使用最简单方法添加显著性ggsignif包 本期教程 获得本期教程代码和数据,在后台回复关键词:20240605 小杜的生信笔记,自2021年11月开始做的知识分享,主要内容是R语言绘图教程、转录组上游分析、转录组下游…...
【Linux】shell脚本变量——系统变量、环境变量和用户自定义变量
系统变量 系统变量是由系统预设的,它们通常在系统启动时被加载,并对所有用户和所有shell实例都有效。这些变量通常控制着系统的行为和配置,例如PATH(命令搜索路径)、HOME(用户主目录)等。系统变…...
QWidget 属性——windowTitle·windowIcon·qrc
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:QT ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、windowTitle二、windowIcon三、qrc 一、windowTitle windowTitle 是一个通常用于表示窗口标题…...
深入理解rtmp(一)之开发环境搭建
深入理解rtmp(一)之开发环境搭建 手机直播在15年的时候突然火起来,随着花椒,映客等出现,直播一下就出现在了风口,各个公司针对直播的战斗迅速打响,战斗过程比较短暂,随着许多公司的退出和死去,手机直播行业趋于稳定,直播服务时长也被传统的CDN厂商牢牢占据,后面大家又把精力投…...
java常用面试基础题
&与&&区别? &和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行,直到整个条件…...
互联网摸鱼日报(2024-06-11)
互联网摸鱼日报(2024-06-11) 36氪新闻 雅诗兰黛,胆子也太大了 苹果WWDC终极前瞻:5大看点20大AI新功能,库克不能输的一战 瑞士清洁科技公司Enerdrape开发预制地热板,回收城市地下空间的浅层地热能和废热用于建筑物制热或制冷 | …...
中介子方程十二
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的学习是一个很重要的一环,但是STL又是一个庞大的章节,因此这里我们先简单介绍一下STL,有助于后面我们对STL的学习,这里就是做一个简单的介绍,并无干货。 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.使用(页面已经…...
安装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采集数据离线存储、网络状态监控、加密上传、鉴权
在无网络环境下进行数据采集并在有网络时上传至服务器,同时确保数据的鉴权和加密,这一需求需要考虑多方面的实现细节。无论您选择原生开发还是使用React Native(甚至Expo),以下是如何实现这一需求的具体步骤和建议。 …...
网络数据库后端相关面试题(其三)
18, 传输控制协议tcp和用户数据报协议udp有哪些区别 第一,tcp是面向字节流的,基本的传输单位是tcp报文段;而udp是面向报文的,基本传输单位是用户数据报。 第二, tcp注重安全可靠性,连接双方在…...
Hadoop之HDFS分布式文件系统
HDFS简介 Hadoop Distributed File System (HDFS): HDFS 是 Hadoop 的分布式文件系统,它设计用于存储大量数据,并提供 高吞吐率的数据访问,通过将数据分块存储在多个节点上,实现数据的冗余存储和容错。 HDFS重要概念 HDFS 通过统一的命名空间目录树来定位文件; 另外,它…...
插入删除单链表指定结点-偷天换日法
王道说下面的代码有BUG,比如当删除的结点p在最后一个元素时,p->nextNULL; So *q NULL; q->data就是错误的,我认为加个判断就行 加个判断即可 /*看着是删除q了,从结果上看就是把p删除了 偷天换日法*/ bool DeleteNode(LNod…...
MybatisPlus代码生成器使用案例
针对数据库中的实体类表,自动生成相关的pojo类,mapper,service等 1. Get-Started 基于mybatisplus,idea下载mybatisplus插件 sql文件 /*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */; /*!40101 SET NAMES utf8 …...
数学公式编辑器(前端预研)
数学公式输入wangeditor: vue2使用wangeditor实现数学公式和富文本编辑器 mathjax文档:MathJax: 让前端支持数学公式 mathjax识别数学公式vue中使用mathjax识别latex数学公式 数学公式编辑器:(少) 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…...
15、架构-可靠通讯之服务安全
概述 我们已经了解了与具体架构形式无关的业界主流安全概念和技术标准(如TLS、JWT、OAuth 2等概念),在上一章节探讨了与微服务运作特点相适应的零信任安全模型。在本节中,我们将从实践和编码的角度出发,介绍在微服务时…...
web刷题记录(5)
[羊城杯 2020]easycon 进来以后就是一个默认测试页面, 在这种默认界面里,我觉得一般不会有什么注入点之类的,所以这里先选择用御剑扫扫目录看看有没有什么存在关键信息的页面 扫了一半发现,很多都是和index.php文件有关࿰…...
Redis高并发高可用
1. 复制机制 在分布式系统中,为了解决单点问题,通常会将数据复制多个副本部署到其他机器,以满足故障恢复和负载均衡等需求。Redis提供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础,后面的…...
【前端取不到cookie的的原因】http-only
某条cookie有http-only属性时,下面两种方法都取不到,还是改需求吧,别取了 1、 npm install js-cookie --save import Cookies from js-cookie let cookieValue Cookies.get(name)2、document.cookie...
推荐 2 个 火火火火 的开源项目
推荐两个开源项目,一个能让你的小爱音响更聪明。另外一个可以让你简单的下载互联网网站上的视频、文件、富文本内容。 01 MiGPT: 让你的小爱音响更聪明 让你的小爱音箱更聪明,提高智能家居的互动性和个性化体验的开源利器! MiGPT 将 ChatGPT …...
从0到100:找搭子小程序开发笔记(一)
背景调查 “找搭子”小程序:能够解决人们在社交、休闲和约会方面的需求,提供方便快捷的方式来找到合适的伴侣或活动伙伴。许多人在社交场合中感到焦虑或不安,因此他们更倾向于使用在线平台来认识新的朋友或搭子。有些人可能生活在一个较小或…...
迷宫最短路径求解--c++
【代码】 #include<iostream> #include<queue> #include<stack> using namespace std; #define ROW 8 #define COL 8 //测试迷宫数据 int maze[ROW][COL] {{0,0,0,1,0,0,0,0},{0,1,0,1,0,1,0,1},{0,1,0,0,0,1,0,1},{0,1,0,1,1,1,0,1},{0,1,0,1,1,0,0,0},{0…...
SpringFramework总结
一.SpringFramework介绍 (一)Spring 广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。 Spring 已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目(模块)组成的成熟技术,例如 Spring Frame…...
品牌与产品:消费者决策的经济逻辑与品牌宣传的战略意义
在当今日益全球化的经济环境中,品牌与产品之间的关系对于企业的成功与否起着至关重要的作用。然而,在消费者做出购买决策时,他们到底是在选择产品本身,还是在选择附着在产品之上的品牌价值?同样,当客户选择…...
MFC四种方法编写多线程
本文以四个demo为例,对MFC的多线程进行学习。学习的过程中写了四个demo,将其做成笔记,发布在csdn上面。 mfc多线程demo1 volatile BOOL m_bRun; CEdit* edit; void ThreadFunc(){CTime time;CString strTime;m_bRun true;while(m_bRun){ti…...
室内设计效果图欧式风格/seo免费自学的网站
输出重定向 > 重定向正确输出2> 重定向错误输出&> 重定向全部 重定向正确输入到file 重定向错误输入到file.err 重定向全部输入到file.all 重定向会覆盖掉原来的内容可以使用输出追加:把>改成>> 管道的应用 "|"管道的作用是将一条命令的…...
昆明网页建站模板/seo初学教程
阿里巴巴算法、数据工程师笔试题 **1、**有三个结点的,可以构成多少个种叉树? **2、**一副牌52张(去掉大小王),从中抽取两张牌,一红一黑的概率是多少? 编程题: **3、**设计一个最优算法来查找一n个元素…...
网站维护专业/网店推广费用多少钱
import Vue from vue import App from ./App import router from ./router import axios from axios Vue.config.productionTip false Vue.prototype.$http axios;...
传媒网站建设/seo网站优化培训班
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:最多提取子串数目 题目 给定…...
北京做网站开发公司电话/百度快速排名优化技术
门牌制作 小蓝要为一条街的住户制作门牌号。 这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7&#…...
海安公司网站建设/百度应用市场app下载
如何智能补全,忽略大小写? 设置之后效果如图: 如何在py文件中设置头部信息? 设置后效果如图: 常用快捷键 ctrlf 搜索 ctrlz 撤销 ctrlq 查看文档 ctrlshiftz 反撤销 ctrl/ 注释 ctrld 复制粘贴选中(复制粘贴复制一行) …...