19.Simulink数学运算模块
19.1 概述
数学运算模块,包含了一些数学运算,比如最常用的加减乘除等。
19.2 Add加法模块
设置加法模块的形状,默认是方形的,推荐使用方形的。
运算符设置。
设置符号为++-,可以理解为本来是0,0+In1+In2-In3.
注意一下输出数据类型,防止溢出。最好根据数据源的实际范围来为输出设置相应的数据类型。
两个uint8相加,超出255,发生溢出。
19.3 Subtract减法模块
减法模块跟加法模块参数设置都一样。用加法模块来表示减法,效果跟直接减法模块一样。
19.4 Product乘法模块
注意一下乘法的方式,一般的数学运算是用默认的点乘的方式即可。如果是两个矩阵做乘法运算,才会去选择用矩阵的乘法。
注意一下输出数据类型,防止溢出。最好根据数据源的实际范围来为输出设置相应的数据类型。如下图的uint8类型的40*9,输出也是uint8的话就会溢出。
19.5 Divide除法模块
除法模块是可以设置运算符的。可以理解为乘法模块初始值等于1,1*第一个输入,结果就等于第一个输入,再除以第二个输入。
可以理解为1/40*400=10
数据类型在多个乘除法的时候,要注意结果的范围。有时候也需要有限数据精度,那应该视情况扩大数据的计算类型,先做乘法,再做除法。
19.5 Sum求和模块
Sum模块和Add加法模块一样,只是形状不一样,多用在传递函数的模型里。
19.6 DotProduct点乘模块
相当于Product的子集。
19.7 绝对值模块
对输入进行绝对值运算。
对于固定点类型,带偏移量的数据类型,要注意,会报错。
19.8 Bias偏移模块
对输入信号进行偏移计算。当然可以使用Add或者Subtract代替。
19.9 Assignment模块
根据Index的值去拿U的值放到输出Y里,Y0是默认值。
Index为1,U是1,赋完值的结果是[1 0 0 0 0]
选择Index的起始是0还是1,从0开始的话元素的Index就是0,1,2,3,4,从1开始的话就是1,2,3,4,5
选择Index为port方式,从输入端去选择Index。
通过Index去赋值其中某几个值。
Size是选择使用Y0的还是选择手动在参数设置里进行输入。
19.10 MinMax模块
可以设置求min或者求max的值,以及设置输入的个数。
我们从一个数组中分别求出最大值和最小值。
输入使用数组,输入Num为1.
Number of input ports设置为3.
求数组的最大最小,对每个Index做比较,求出来最大最小的值。
输入的维度不一致,导致报错。
19.11 FindNonzeroElements模块
查找非零元素,可以自己搭建模块组合去做这个功能生成代码,不使用模型自带的模块。
19.12 MathFunction模块
数学函数模块,包含了一些常用的数学函数,比如exp,log,10^u,ln,square,pow,rem,mod等。
19.13 MatrixConcatenate模块
用来组合向量和矩阵。
单个信号组合成向量。
2个单信号组合成多维数组,维度是1X2.
2个数组组合成一个向量。
组合出2行3列的数组。
组合成2行3列的矩阵,用Reshape模块去转置。
19.14 MinMaxRunningResettable模块
输出所有之前输入的值的最小值(选择min),但是可以被Reset使用Initial Condition的值。max相反。
设置使用min还是max。以及初始的值。
记录所有时刻的最大最小值
19.15 ProductofElements累乘模块
针对输入的每个元素的乘法运算。a方式,是对Number of inputs进行设置,如图,设置完就会显示多个port对应每个运算,跟普通的Product用法一致。
运算结果
b方式,我们设置Number of inputs为*,然后对输入进行搭建,连接。仿真完后看到结果和上面的运算一样。
19.16 ReciprocalSqrt模块
可以选择三种计算,是求根号sqrt,将带符号值进行绝对值运算再求根号signedSqrt,求根号再求倒数rSqrt。
最简单的求根号sqrt,对4进行运算,得出结果2.
对-4进行开根号运算,得出无效值。
signedSqrt的输入值的符号对输出结果是有影响的,输入是什么符号,输出就是什么符号,根号是对输出的绝对值进行运算。
rSqrt先开根号,再求倒数。
19.17 SignedSqrt模块
与ReciprocalSqrt模块倒数平方根模块一样,只是默认选项选择的是带符号的平方根运算。
19.18 Sqrt模块
与ReciprocalSqrt模块倒数平方根模块一样,只是默认选项选择的是带符号的平方根运算。
19.19 Reshape模块
改变矩阵或者向量输入的维度,按照重新设定的方式输出。比如说输入是一个数组,我们可以把输出设置为1维数组,列向量,行向量,M*N矩阵
可以看到数据类型后面的括号()里显示的是5,表示输入和输出一样,是普通类型的数组。
修改为列向量输出后,模块图标发生变化,仿真输出的维度也发生了变化,变成了5X1.
同样地,修改为行向量以后,如下图
设置为Customize,将输出的维度设置为[2,3],仿真后,输出变成了2X3的矩阵。
输入是2X3矩阵的时候,各种设置的输出情况。
19.20 RoundingFunction模块
舍入函数 | 舍入输入信号的每个元素 |
“floor” | 朝负无穷方向舍入到最接近的整数值 |
“ceil” | 朝正无穷方向舍入到最接近的整数 |
“round” | 舍入到最接近的整数 |
“fix” | 朝零方向舍入到最接近的整数 |
选择floor,进行向下取整,对pi进行取整,取完以后变成了3.
设置为ceil是向上取整,直接进1,结果是4
设置为round,取接近的整数的值
fix在负数取整的时候与floor不同,与ceil相同。
19.21 取符号Sign模块
Sign模块的输入为正,则输出1,输入为负,则输出-1,输入为0,则输出0
使用Switch和CompareToConstant模块搭建Sign模块的逻辑
搭建完仿真结果如下
19.22 SineWaveFunction模块
生成代码不使用,仿真可以用来产生输入波形。
产生的波形
19.23 SliderGain滑动增益模块
生成代码不使用,仿真可以用来拖动变换增益效果。可以设置最大和最小的限值,然后在限值中间可以进行滑动设置。
19.24 Squeeze挤压模块
生成代码没有使用过(我个人,如果有使用场景可以在评论区留言告诉我或者是微信联系我)。比如说像2X1X3这样的矩阵改变成2X3的矩阵。
将3X1X2的数据挤压成3X2。
3X3X2的数据不变,直接输出。
19.25 SumOfElements累加模块
对每一个元素进行求和,输出结果。
对一维数组进行累加,得出结果15
对二位数组进行累加,得出结果30
19.26 三角函数模块
对输入进行sin或者其他的函数运算,输出相应的值
在Function里选择运算的函数,比如生活sin,cos,tan等。atan2函数跟atan的区别是,atan2输入是两个值,atan输入是一个值,atan2可以输入象限的信息,但是atan是没有办法的。
近似值逼近方法可以选择CORDIC和Lookup。
查找方法角度的单位,弧度或者是旋转。
波形显示如下,选择数量跟最终的波形有关系,数量越大,越接近原始的值,数量越小,精度损失会比较大。
数量分别选择4后的波形
19.27 取反模块
对输入进行取反后输出。
int8的数据范围是-128~+127,如果我们对-128取反,在int8的数据类型下,我们是没办法得到正确的输出,因为int8的范围取不到+128。-128不勾选Saturate on integer overflow的输出时候,输出还是-128,如果勾选的话,输出是+127
数据类型不够用的时候,考虑对数据类型做扩充。
Simulink里对无符号整形不能进行取反操作,直接报错。
19.28 向量连接模块
Vector Concatenate向量连接模块,参数设置输入个数不讲了,模式有Vector向量,和Multidimensional array多维数组。
选择Vector。把两个单变量,组合成一个数组。
两个1X3的行向量,组合完是一个1X6的行向量。
两个3X1的列向量,组合完是一个6X1的列向量。
当我们选择多维数组模式的时候,模块的外观发生了变化,变成了矩阵连接模块的样子。我们设置为1维,仿真结果如下
设置为2维,我们看到输出结果变成了3X2的数组。
不同数据的组合。