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

本文主要是介绍【研发日记】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为数据处理算法降阶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049365

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig