找回密码
 注册
Simdroid-非首页
查看: 76|回复: 1

S函数如何输出矩阵或者长度不同的向量?

[复制链接]
发表于 2011-4-11 14:46:58 | 显示全部楼层 |阅读模式 来自 广东广州
前言:首先分享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

查看全部评分

发表于 2011-4-11 22:22:47 | 显示全部楼层 来自 广东广州
Simdroid开发平台
在simulink里直接矩阵输入或者输出貌似是会有些预料不到的问题.....
如果真的想将s函数里计算出的矩阵输出,我一般是reshape成向量,哪个模块或函数需要用在用之前reshape回去,线路传输上一直都是向量,这样demax也好分。自然也就解决鸟你的向量和矩阵想一起输出的问题,反正都变成一个向量了,和在一起长度写对s函数让你随便输出,好几个不一样的矩阵也木问题~
抛砖引玉..引玉啊~~

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 21:29 , Processed in 0.034416 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表