研发日记,Matlab/Simulink避坑指南(八)——else if分支结构Bug

文章目录

前言

背景介绍

问题描述

分析排查

解决方案

总结归纳


前言

见《研发日记,Matlab/Simulink避坑指南(三)------向上取整Bug

见《研发日记,Matlab/Simulink避坑指南(四)------transpose()转置函数Bug

见《研发日记,Matlab/Simulink避坑指南(五)------CAN解包 DLC Bug

见《研发日记,Matlab/Simulink避坑指南(六)------字节分割Bug

见《研发日记,Matlab/Simulink避坑指南(七)------数据溢出钳位Bug

背景介绍

在一个嵌入式软件项目中,需要对一个信号进行分段处理。思路是使用Simulink中的Matlab Funcyion模块,采用else if的结构进行处理,示例如下:

R 复制代码
function y = fcn(u)

if u < 0
    y = -int16(u);
    
else if u < 10
    y = 10*int16(u);
    
else if u < 20
    y = 20*int16(u);
    
else if u < 30        
    y = 30*int16(u);
    
else if u < 40        
    y = 40*int16(u);
    
else        
    y = int16(u);
    
end        
end
end
end
end

问题描述

按照上述示例,程序运行功能都是正常的,但是代码中一直有标红的警告,示例如下:

分析排查

看警告的提示信息,意思是代码的排版有问题,按照提示对代码进行修改,示例如下:

这样标红的警告消失,说明前面确实是代码排版问题。看上面的if else结构,Matlab认可的是这种逐层嵌套的框架,而不是C语言中惯用的else if并列分支框架。

解决方案

如果采用上述逐层嵌套的结构,需要经常调整前后if和end的对齐问题,而且这种庞杂的框架难免会增加代码出现逻辑错误的可能性。于是我们查阅Matlab官方关于if else的文档,找到了类似C语言中并列的分支结构(elseif是一个专用的关键词,中间没有空格分隔),示例如下:

按照上述语法对我们的算法进行调整,示例如下:

这样没有出现标红的警告,也没有引入新的问题,程序运行起来功能也符合要求, Bug修复完工。

总结归纳

Matlab中的else if并列分支结构,与C语言中的有一个细微区别。C语言中是else if作为一个关键词充当一个语法结构,但是在Matlab中如果中间有空格会被认为是两个关键词,按照两个语法结构被对待。所以在Matlab中要实现和C语言中一样的效果,就要去掉else和if之间的空格。这是两种编程语言在不同使用环境中的一点差别,需要开发者自己留意。


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

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

相关推荐
2zcode17 小时前
项目文档:基于MATLAB图像处理与FCM聚类的骨癌X射线影像辅助检测系统设计与实现
图像处理·matlab·聚类
2zcode2 天前
项目文档:基于MATLAB深度卷积特征的多曝光图像自适应融合系统设计与实现
深度学习·计算机视觉·matlab
Promise微笑3 天前
回路电阻测试仪采购:多维度技术评估与深度避坑指南
开发语言·matlab·语音识别
程高兴3 天前
PMSM基于在线转动惯量辩识的滑模负载转矩观测器MATLAB-SIMULINK仿真模型
开发语言·matlab
2zcode5 天前
项目文档:基于MATLAB低采样率ISAR成像的快速稀疏重建算法研究
开发语言·算法·matlab
matlab代码5 天前
Matlab基于主成分分析PCA人脸识别系统(GUI界面)【源码44期】
开发语言·matlab·人脸识别
Evand J6 天前
【MATLAB例程】一维EKF(扩展卡尔曼滤波)、UKF(无迹卡尔曼滤波)、CKF(容积卡尔曼滤波)、PF(粒子滤波)四种滤波方法对比
开发语言·matlab·ekf·ckf
茗创科技6 天前
CGE连接组:用基因表达解码脑疾病的异质性(附高分文献下载)
python·matlab·脑网络
EW Frontier7 天前
GRAIL-SCML:一种几何正则化自适应集成似然的波达方向估计算法【附MATLAB代码】
matlab·自适应·宽带·doa估计·波达方向估计·几何正则化·窄带