嵌入式Matlab:持久变量问题

时间:2010-02-14 15:34:04

标签: 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处理,解决方案对我来说并不明显。

3 个答案:

答案 0 :(得分: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现在是有状态函数句柄,本质上是捕获了yr状态的闭包,因为它是在创建函数句柄的位置(标记为注释“%(1)”的行)。可以使用括号索引调用它们,它看起来就像函数调用:

  
    

y = integrator1(x,t);

  

在执行函数句柄期间对yr的任何修改都将保留在函数句柄中,因此在上面的示例中,每次调用积分器时,yr将继续递增1,但仅针对该特定实例集成商。

答案 1 :(得分: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 :(得分:0)

每次都可以发送yr变量并将其返回给函数。对于上面的代码,您需要有一个x_yr变量和一个y_yr变量。它可能不是很优雅,但它会起作用。

如果你只想要这个函数的两个实例(如上面的x和y)那么你可以创建两个相同的函数,除了像xintegrator和yintegrator这样的名字。或者,你可能有一个数组,并在调用积分器时发送参数,指定要使用的数组中的哪个值。