赞
踩
最近做的东西涉及到matlab中simulink工具及其内嵌函数。
simulink自带模块非常多,但是内嵌函数会更灵活,自己写了一个关于一维数组kalman filter的算法,但是过年那会回家心不在焉的,就随便写写了。回到学校发现有很大的BUG,输出结果不能用(其实在家就发现了)。
在matlab function下编写.m文件,因为这个.m文件是内嵌到simulink中,他的参数不会存入matlab workspace中,所以每个时间步长都会执行一次这个.m文件,那么问题来了,如果这个.m文件中需要对一些参数初始化,而且对参数要有存储记忆(本来就有存储,我只是怀疑一下),如果每个步长都执行初始化,存储毫无意义,输出数据也没有用。
刚开始我用的是在初始化函数中定义参数到workspace,结果是不行,存储空间不同在内嵌函数中读不到这个参数。
然后用global定义全局变量,这个方法理论上是可以的,利用constant在simulink中加入定义变量,在内嵌函数中global一下,例程完全理解,但是用在我的这个系统中就会报错,提示是不可用参数。然后就这样白折腾了一天(2月21日,今天过得很糟,淋雨,亏钱,还很饿)
然后睡一觉骗自己什么都忘了,开始第三种方法,利用persistent定义每个变量,这个方法是在另一个CSDN博客看到到,但是忘了存博客网址,抱歉。
我用我的代码单例子解释:
persistent flag1 p_last Q R x_mid x_now p_mid p_now z_real z_measure x_last if isempty(flag1) flag1 = 0; p_last = 0; % Xe1 = xe1.signals.values;%模型过程数据 % Xe2 = xe2.signals.values;%系统测量数据 Q = 0;%过程噪声 R = 0.01;%测量噪声 x_mid = 0; x_now = 0; p_mid = 0; p_now = 0; z_real = xe1; z_measure = xe2; x_last = z_real; x_mid = x_last; sum_kalmanerr = 0; sum_measureerr = 0; end
用persistent定义每个你需要存储且保持的变量,定义后的值都是空,然后用if语句做初始化。把每一个变量的值都初始化。每次进入都会先执行persistent定义的变量,这个在第二个步长进来后flag1就有数值,不会进入if语句,就能完成对参数的初始化。
这种方法和global的区别就在是在函数内部调用存储器,global是在外部调用存储器,每次调用两种方法都是提取上一次赋值的值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。