Simulink代码生成: For Iterator子系统及其代码-程序员宅基地

技术标签: simulink  

本文研究Simulink中的For Iterator子系统及其生成的代码。

1 Simulink中的For Iterator子系统

不管是在C语言还是Matlab脚本编程的时候,都避免不了使用for循环来反复执行某一段代码。在Simulink中,也可以通过For Iterator子系统来实现循环功能。

新建一个For Iterator子系统(For Iterator Subsystem),会默认带有一个输入输出port。
在这里插入图片描述
进入子系统内部,会有一个默认的For迭代器(For Iterator)。
在这里插入图片描述
这个迭代器就能够让模型反复循环子系统的内容。

2 For Iterator子系统建模示例

博主在大学学习C语言的时候,就有个课后习题,要求用for循环求数组中元素之和。所以本例也用For循环子系统来求和。

1)双击进入子系统,将For Iterator参数配置如下。
在这里插入图片描述

  • States when starting配置为reset,表示每个时间步长都重置这个For Iterator子系统;
  • Iteration limit source配置为external,表示循环次数由外部端口引入;
  • Index mode配置为Zero-based,表示索引从0开始,和C语言索引方式保持一致;
  • Iteration variable data type配置为int8,表示循环变量是int8类型;

2)建立一个Selector选择器模块,配置参数如下。
在这里插入图片描述

  • Number of input dimensions配置为1,表示从向量中选择一个元素输出;
  • Index mode配置为Zero-based,表示索引从0开始,和C语言索引方式保持一致;
  • Index Option配置为Index vector,表示从外部输入一个向量;
  • Input port size配置为5,表示输入向量中元素的个数是5;

3)添加2个输入port,如图。
在这里插入图片描述

  • port1表示输入的向量;
  • port2表示向量的长度;
    简单描述一下这一段的逻辑:For Iterator模块输出0-4的索引,通过Selector选择器把向量中的第0-4个数值取出来,然后再输出。注意,这些操作都是在一个时间步长内完成的。

4)通过一个加法模块和单位延时模块,构建一个累加器,接在Selector模块后面。这样就可以通过循环把向量中的每个元素相加。
在这里插入图片描述
5)整个子系统内部的模型如图所示。
在这里插入图片描述
6)退到For Iterator子系统上一层,加上2个常量输入和一个display输出。
在这里插入图片描述

  • 输入1是一个包含5个元素的向量[1,3,5,7,9];
  • 输入2是向量的长度5;
  • 两个常量的类型都配置为uint8.

Ctrl + D更新一下模型,就能看到输出的disp中的结果为25,正式输入的向量元素之和。

3 For Iterator子系统的代码

将第2章仿真的模型稍作修改,然后就可以生成代码。
1)将输入、输出换成Inport和Outport模块,然后重新Ctrl + D更新一下模型。
在这里插入图片描述
这里注意一下维度和数据类型。Inport1的类型默认为了double,维度向后继承了Selector模块设定的size为5;Inport2的类型向后继承了For Iterator模块设定的的int8类型。

2)Ctrl + B生成一下代码,如图所示。
在这里插入图片描述
代码中可以看出以下几点:

  • 首先定义了循环变量s1_iter,类型为int8,与Iteration variable data type配置对应;
  • for循环条件为s1_iter < demo_U.In2,表示循环次数取决于Inport2,和模型相对应;
  • 输出的Out1在循环中不断累加,每次循环会加上Inport1的一个元素,直到循环结束。

3)打开头文件,可以看到对输入输出结构体的类型定义。
在这里插入图片描述
可以看出,In1的长度是5,In2的类型是int8,都可以和模型相对应。

4 总结

For Iterator子系统在实际工作中由很多应用场景,所以需要理解基本用法。另外,通过Stateflow也可以实现for循环。

>>返回个人博客总目录

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013288925/article/details/107849748

智能推荐

一、基于JAVA的GB28181实现之SIP服务_java gb28181-程序员宅基地

文章浏览阅读2.8k次。GB28181定义了了 基于SIP架构的 视频监控互联规范,而对于多数私有协议实现的监控系统如果想接入SIP架构,就要借助网关,GB28181 规范了实现 SIP 监控域与非SIP 监控域互联。最近用JAVA的SIP协议写了一个GB28181平台的对接,并成功完成了海康、大华、中威等设备,更重要的是海康平台、公安一所平台的对接。因为行业内很少有JAVA方面的设备接入实现,希望本篇能够让JAVA在安防接入生态中发挥越来越大的作用。_java gb28181

深入理解操作系统原理之文件系统_磁带设备的主要用途是作为文件系统的后备,存放不常用的信息或用做系统间传送信息-程序员宅基地

文章浏览阅读3.1w次,点赞20次,收藏154次。一、概述操作系统对系统的软件资源(不论是应用软件和系统软件)的管理都以文件方式进行,承担这部分功能的操作系统称为文件系统。1、文件计算机系统对系统中软件资源:无论是程序或数据、系统软件或应用软件都以文件方式来管理。文件是存贮在某种介质上的(如磁盘、磁带等)并具有文件名的一组有序信息的集合。 文件名是由字符和数字组成的,例如MS-DOS中文件名由三部分组成,格式如下:[] [._磁带设备的主要用途是作为文件系统的后备,存放不常用的信息或用做系统间传送信息

ipadpro编写java代码_iPad Pro变生产力工具,你还缺个轻量级浏览器端代码编辑器...-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏15次。本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。注意,这篇文章就是在劝你买iPad Pro(手动狗头)~最近,苹果推出了新的iPad Pro,号称生产力工具。然而对程序员来说,不能写代码,就难以称得上生产力。虽然也有一些优秀的写代码App可供程序员使用,但本着能不花钱就不花钱的原则,还是可以去找一些开源软件。于是乎,现在有一款免费的浏览器端代码编辑器CodeJar,值得..._ipad写代码软件java

Elasticsearch学习--2 安装es、kibana、分词器_kibana查看索引分词器-程序员宅基地

文章浏览阅读418次。ES的安装下载地址https://www.elastic.co/cn/downloads/past-releases#elasticsearch示例下载的6.2.4版本慢的话,可以去华为云镜像下载,速度杠杠的https://mirrors.huaweicloud.com/elasticsearch/安装步骤前置环境:centos7、jdk1.81、保证有linux的非root用户es不能通过root用户启动,会报错;如果没有,新建用户,命令如下:新建用户:useradd xxxx _kibana查看索引分词器

1.Echarts设置图例数值和名称样式不同_echarts series name 怎么设置不同的值-程序员宅基地

文章浏览阅读223次。Echarts设置图例数值和名称样式不同_echarts series name 怎么设置不同的值

Nodejs项目部署到华为云服务器并上线超详细教程_nodejs服务器-程序员宅基地

文章浏览阅读674次,点赞26次,收藏7次。由于是第一次做Nodejs项目,发现网上关于Nodejs项目部署服务器的教程的质量参差不齐,对于初学者很不友好,看了一堆教程,最后还是不会,一头雾水,所以决定自己写一个详细教程,方便以后学习查看并记录。废话不多说,正文正式开始;_nodejs服务器

随便推点

python随机库中几个实用随机函数的使用_1.data = randomnumbers(10, 1, 100)功能是什么?-程序员宅基地

文章浏览阅读345次。import randoma=random.randint(10,100)#生成一个1-100的随机数b=random.randrange(10,100,10)#生成一个10-100步长为10的随机整数c=random.getrandbits(16)#生成一个16比特的随机整数d=random.uniform(10,100)#生成一个1-100的随机小数e=random.choice([1,2,3,4,5,6,7,8])#从序列中随机选择一个数f=random.random()#生成一个0-._1.data = randomnumbers(10, 1, 100)功能是什么?

前端项目部署后,如何提示用户版本更新_前端通知用户更新-程序员宅基地

文章浏览阅读8k次,点赞93次,收藏86次。项目部署上线后,特别是网页项目,提示正在操作系统的用户去更新版本非常important。一般我们都会用“刷新大法”来清理缓存,但是对于正在操作网页的用户,不造系统更新了,请求的还是老版本的资源。为了确保用户能够及时获得最新的功能和修复的 bug,我们需要通知用户刷新页面获取最新的代码。_前端通知用户更新

DOM Based Cross Site Scripting or XSS of the Third Kind_the application may be vulnerable to dom-based dom-程序员宅基地

文章浏览阅读2k次。SummaryWe all know what Cross Site Scripting (XSS) is, right? It’s that vulnerability wherein one sends malicious data (typically HTML stuff with Javascript code in it) that is echoed back later by _the application may be vulnerable to dom-based dom data manipulation. data i

Vue3父子组件emit参数传递(解决Vue2this.$emit无效问题)_vue3 this.$emit-程序员宅基地

文章浏览阅读2.4w次,点赞13次,收藏24次。之前写了一篇Vue3路由跳转问题的博客,发现还是有很多同学对基本的使用改变还没有了解,于是我就顺道把常用的组件间传递的方式也写一下吧.......注意的是:1.Vue3中不在强调this的使用,可以说你在setup中完全不能用this,不像Vue2中把全部的内容都集成到this中。2.Vue3现在由于compositionAPI的方式可以说是弱化了Vuex的存在(当然Vuex现在可以用没什么变化)。3.如果您有Vue2的开发经历,用Vue3也不会特别陌生,会很快上手。目录1.解决._vue3 this.$emit

Unity与C++网络游戏开发实战:基于VR、AI与分布式架构 【1.3】_unity分布式仿真-程序员宅基地

文章浏览阅读610次,点赞18次,收藏9次。C#语言从本质上来说是在C++语言的基础上衍生出来,它是基于托管生成和指针管理的一种面向对象的编程语言。相比C++语言,它是一门更加简单、安全和易于学习的语言。它继承了C++语言强大的功能,摒弃了一些C++语言里比较复杂的使用方法,比如去掉了宏模板多重继承这些复杂的概念。C#语言借用了Visual Basic语言的可视化编程方法,基于.NET的开发库,开发了一套C#使用的可视化编程库,让C#语言,既拥有C++语言的强大能力,也更加人性化,让开发人员更加易于上手。C#语言具有以下特性:·语言简洁。_unity分布式仿真

推荐文章

热门文章

相关标签