2015-05-13 43 views

回答

1

使用持久變量是正確的方法,但正如您發現的那樣,您不能在MATLAB功能塊中使用varargin。訣竅是檢查變量是否爲空,如:

function y = fcn(x,d,yp) 

persistent yp 

if isempty(yp) 
    yp=0; %only if yp is empty, i.e. at the beginning of the simulation 
end 

if (x-yp<=d) 
    y=x; 
else 
    y=yp + d; 
end 

yp=y; % here i want to load output value 
+0

謝謝你隊友救了我的命! –

4

yppersistent

function y = fcn(x,d,varargin) 
persistent yp 

if nargin>2 
    yp = varargin{1}; 
end 
... 
yp=y; 
end 

由於yp是持久的,現在下一次你會調用該函數yp就已經抱着你先前計算的y值。唯一的問題是不要像當前那樣通過yp=0覆蓋它。

我用函數參數列表中的yp替換爲varargin,它包含可選參數。你第一次打電話fcn你應該把它稱爲y = fcn(x,d,0),其中零將被傳遞到函數內的yp。下一次,你應該把它叫做沒有第三個參數不重寫值yp持有(即y = fcn(x,d)

+1

謝謝,但我忘了提及,我使用Matlab函數Simulink塊,它不能使用此方法。我收到錯誤消息:頂層函數不能有varargin。 –

+0

@MarcelReisinger作爲一個可能的工作,你可以讓'yp'' global'而不是'persistent'。然後在你調用'fcn'的循環之前,你可以將它初始化爲零(或者任何你喜歡的)'yp = 0',就是這樣。但要確保你永遠不要再觸摸'yp'(在'fcn'之外)。然後在'fcn'中刪除'varargin'和'if nargin'塊。 – PetrH

3

除了persistent變量,你也可以保存該值在嵌套函數返回的句柄該函數:

function fun = fcn(yp0) 

    yp = yp0; % declared in the main function scope 

    fun = @(x,d) update(x,d); % function handle stores the value a yp above and updates below. 

    function y = update(x,d) 
     if (x-yp<=d) 
      y=x; 
     else 
      y=yp + d; 
     end 
     yp = y;  % updated down here 
    end 

end 

然後您可以使用它像

fun = fcn(yp0); 
y = fun(x,d); 

我用這個,而不是持續性的變量時,我注意到一個業績增長從沒有檢查PE的初始化rsistent變量。

+1

謝謝,但我忘了提及,我正在使用Matlab函數Simulink塊,它不能使用此方法。我收到錯誤消息:不支持嵌套功能。 –

相關問題