在function头的下一行增加%#codegen
符号,其作用是为了使静态代码分析器Code Analyzer 诊断代码并提示用户对可能在代码生成的过程中导致错误的违规写法进行修正。
MATLAB Function内部的M语言有严格的要求: 变量必须要给定初始值及其维度,变量类型及其虚实性,不支持变维度变量
simulink中的运行机制,每个采样点会调用一次MATLAB Function的函数,两次调用之间,同一个变量的前次计算结果传递到当前计算周期是个大问题。解决的办法是采用persistent
变量来实现函数退出和进入时内部变量值的保持。
persistent变量是定义在某个函数内的来变量类型,可以在函数调用的不同次数间保持上一次退出该函数的值。它变量声明与global
的区别是,persistent
变量是能在被定义函数中被识别,避免被外部修改。声明persistent
变量时,它刚刚被创建,还不具有初始值,其内容为空值[ ]。调用persistent
变量的函数时,先判断persistent
变量是否为空。如果为空需要进行初始化赋值。当非空时,它会记住上次被调用的结果。
Example 1:
function y = fcn(u)
%#codegen
%*********初始化******************
persistent sum_val
if isempty(sum_val) %初始化
sum_val = 0;
end
sum_val = sum_val + u ;
y = sum_val;
Example 2:
% 来源https://blog.csdn.net/zouxu634866/article/details/103766675
function y_filter = fcn(u)
persistent A B C D Q p R x1 p_1
% 对于一直保持不变的值,我们可以这样赋值:
A=[1.000 0.0010;0 0.9753];
B=[0.0001;0.1314];
C=[1 0];
D=[0];
R=1;
Q=1;
% 对于需要调用上次结果的值,我们需要这样赋值:
if isempty(x1)
x1=zeros(2,1);%上一时刻对象的状态
end
if isempty(p_1)
p_1=B*Q*B';
end
x1=A*x1+B*u(1);
p=A*p_1*A'+B*Q*B';
K=p*C'/(C*p*C'+R);
x1= x1+K*(u(2)-C*x1);
y_filter=C*x1;
p=(eye(2)-K*C)*p;
x1= x1;
p_1=p;
y_filter = y_filter ;
参考文献:
- https://blog.csdn.net/u011731418/article/details/84144849
- https://blog.csdn.net/zouxu634866/article/details/103766675