MATLAB使用Simulink內嵌函數初始化以及保持更新值的方法

最近做的東西涉及到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是在外部調用存儲器,每次調用兩種方法都是提取上一次賦值的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章