2010-02-14 60 views
2

我寫了一些功能,使得使用持久性的變量,例如:嵌入式MATLAB:問題與持久性變量

function y = integrator(x, t) 
persistent yr; %result 
... 

,然後,如果我在一個週期內只有一次調用它,一切工作正常:

x = integrator(x_dot, t); 

,但如果我想使用不同的參數調用兩次,它會給出錯誤的結果:

x = integrator(x_dot, t); 
y = integrator(y_dot, t); 

ŧ他並不意外,但我該如何處理?使用不同的(非持久性)變量或什麼?

我習慣主要處理Simulink,並且解決方案對我來說並不明顯。

回答

0

您可以每次發送並返回yr變量給函數。對於上面的代碼,您需要有一個x_yr變量和一個y_yr變量。它可能不是很優雅,但它會起作用。

如果你只想要這個函數的兩個實例(如上面的x和y)那麼你可以做出兩個函數,除了像xintegrator和yintegrator這樣的名字是相同的。或者,您可以讓yr爲一個數組,並在調用積分器指定要使用的數組中的哪個值時發送參數。

1

最好的解決辦法改變你有什麼喜歡的東西:

function [y, yr] = integrator(x, t, yr) 
if nargin < 3 
    yr = []; % will behave identically to persistent when yr is not given 
end 

現在您可以重複調用爲:

[x,xr] = integrator(x, t); 
[x,xr] = integrator(x, t, xr); 

[y,yr] = integrator(x, t); 
[y,yr] = integrator(x, t, yr); 

雖然我不會推薦它,有一種方法保持您當前的實施並且達到您想要的結果。通過清除函數可以清除持久變量。這將允許你「重置」的執着變量,這意味着調用順序應該工作:

x = integrator(x_dot, t); 
clear integrator; 
y = integrator(y_dot, t); 

但是請注意,這可能不會產生預期的結果調用

x = integrator(x_dot, t); 
clear integrator; 
y = integrator(y_dot, t); 
clear integrator; 
x = integrator(x_dot, t); 

而在當我建議的解決方案首先可以撥打

[x,xr] = integrator(x, t); 
[y,yr] = integrator(x, t); 
[x,xr] = integrator(x, t, xr); 
[y,yr] = integrator(x, t, yr); 

並且結果將保持預期狀態。

2

你可以使用一個封閉此:

function integrator_handle = make_integrator(yr) 

    function y = integrator(x, t) 
    y = x + yr; 
    yr = yr + 1; 
    end 

integrator_handle = @integrator; % (1) 
end 

要使用:

>> integrator1 = make_integrator(0); % 0 is the initial value for yr 
>> integrator2 = make_integrator(1); 

integrator1和integrator2現在狀態函數處理,本質上已抓獲歲的狀態,因爲它是封閉在創建函數句柄的位置(標有註釋「%(1)」的行)。它們可使用括號索引,這看起來就像功能調用被調用:

Y = integrator1(X,T);

功能句柄的執行過程中的任何給年修改將與功能句柄被保留,所以在上述我的例子,YR每次將保持遞增由一個積分器被調用,但只爲積分器的特定實例