- 积分
- 0
- 注册时间
- 2011-1-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
前言:首先分享S函数多输出,并且是输出多个矩阵的一点儿经验。
编写了S函数,function sys=mdlOutputs(t,x,u)中,调用了一个外部的函数outfunction(这个是自己定义的),outfunction在outfunction.m中(真啰嗦),调用语句为[a,b]=outfunction(a1,b1,c1)——a,b为outfunction计算后返回的数据,a1,b1,c1为outfunction计算时用到的输入,与本次讨论无关,不用理会。a,b为5×6000矩阵,发现case3 中,写sizes.NumOutputs = 1,在function sys=mdlOutputs(t,x,u) 的结尾,写sys= a,或者sys=[a] 提示错误,无法输出矩阵,后来把矩阵分解成向量输出,成功。
其实就是把case3 中,改成sizes.NumOutputs = 6000即可。而要输出两个变量a,b,他们的维数等于5×6000,此时只需改成 sizes.NumOutputs = 12000 ,然后在function sys=mdlOutputs(t,x,u) 的结尾,写sys= [a b]或者sys = [a,b],最后在simulink中,S函数的输出端加一个Demux模块即可实现。
假设S函数每算出的一个输出都用矩阵表示,最终的结果为一个5×12000的矩阵,中间的过程为:第一次运算得出数据(1,1)输出到Demux,然后分配成输出线路1,得出数据(1,6001)通过Demux分配到线路2,;第二次运算得出数据(1,2)输出到线路1,数据(1,6002)到线路2,依次类推,最终,线路1得到的输出就是a,线路2得到的输出就是b。——这个我对比验证过,因此上述运算过程虽然是我自己意淫的,但是好像没错。
问题:如果要实现一个向量c和一个矩阵a同时输出,就出现问题了。因为按照我采用的方法,将case3 中,sizes.NumOutputs = 6001(a为5×6000,c为5×1),这时发现输出到线路1上的是5×3001的矩阵,线路2上是5×3000的矩阵,原来S函数的输出进行评价分配了。改了NumOutputs ,比如将6001改成[6000,1]等等,但发现这里只是定义输出的个数数,用矩阵定义无效。又尝试将a,c通过mat2cell变成cell,然后输出时写 sys = [a,c],但错误提示:输出必须为实向量,cell不符合(应该是S函数支持cell),找到level-2 的S函数,发现里面定义的输入输出类型都是"real",cell当然不符合(不信就用real命令对一个cell试试),到小弟只是研究了level-1的S函数,2级的没有细看,最好能用1级的解决。
总之不管怎么改都不行,可能还有别的输出矩阵的方法,所以请教各位高人:S函数如何输出矩阵或者长度不同的向量????第一次发帖,希望不要冷了小弟的心,多多支持。 |
评分
-
1
查看全部评分
-
|