我编写了一些使用持久变量的函数,例如:
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 :(得分: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这样的名字。或者,你可能有一个数组,并在调用积分器时发送参数,指定要使用的数组中的哪个值。