本文研究Selector模块的用法和该模块生成的代码。
1 Simulink中的Selector模块
Selector翻译过来就是选择器的意思。该模块用于将Vector信号或者Matrix信号中的某个元素选出来。对应C代码中就是根据某个索引将数组(一维或者多维)中某个元素提取出来。
1.1 Selector模块的简单模型
首先打开Simulink,建立一个Selector模块。
可以看出默认的Selector模块左边有三个矩形,右边有两个,并且左边的第一、二个矩形和右边的两个之间有连线。这里推测是将左边输入的三个数的前两个选择出来,从右边输出。
为了验证一下这个想法,在左边建立一个Const模块,数值为[2,4,7]。右边加一个Display模块用于观察结果,如图所示。
运行后观察Display模块,发现确实输出了前两个数。通过配置参数,可以让这个模块输出特定位置的元素。
1.2 Selector模块的参数
双击Selector模块,打开Selector模块的参数窗口,其中有很多可配置的参数。
1)Number of input dimensions
这一项指定了输入的维度。Vector信号对应的是一维数组,这里就写成1。如果是二位数组,输入则是一个[nxn]的Matrix信号。下图展示了一个Matrix信号的,并选择出它第二行第三列的元素。
2)Index Mode
字面意思是索引模式,可以选择Zero-based或者One-based。区别是下标从0开始算还是从1开始算。
如下图所示,如果选Zero-based,Index为2,就会把第3个元素提取出来。
3)Index Option
这一项是Index的设置,有5个选项。
Index vector这一类是直接按照后面的Index输出;Starting Index是按照开始的索引和一个长度,输出若干个连续的元素。
后面括号中的dialog或者port指的是Index是否由外部port口给出。如果是选择了(port),模块就会变成下面这个样子,可以通过一个port口输入一个index值。
4)Input port size
这一项在Dimensions选择为1维的时候才有,指的是输入Vector的长度。如果长度和实际输入不匹配会报错。
博主在工作中常见的选择配置是,Number of input dimensions是1维,因为很少处理Matrix信号;Index Mode是Zero-based,符合C代码习惯;Index Option选Index vector(port口),因为多数情况下只要用到数组中的一个元素,而且port口可以更直观地反映出提取的是哪个元素。
2 Selector模块的代码
Selector模块中的配置很多,这里只选择常见的一种情况,研究代码生成。
章节1.1中的模型做少许修改得到如下demo模型。
其中,把输入U的Port dimensions设为4,也就是输出了一个[1x4]的vector。输入U和Idx都是single型。
将Selector设置如下,
这个模型的含义是,根据In2的数值,挑选出In1的中对应索引的值。
Ctrl + B生成代码,如下
可以观察到step函数中,In1是个长度为4的数组,类型是浮点型。In2也是浮点型,将其类型转换为int32后作为In1的数组下标,取出对应的数值赋给了Out1。
3 总结
Selector在代码中的表现还是比较简单的,主要是模型中做好正确的配置。另外,Selector模块比较常用,而且会经常和循环相关的模块配合一起建模。