Matlab删除循环以计算PT1

时间:2012-06-12 07:37:24

标签: matlab vectorization

我正在使用输入向量u:

在Matlab中计算PT1行为
u(20:50,1) = 2;
k = 0.8;
x=zeros(50,1);
for i=2:size(u,1)
    x(i) = k*x(i-1) + (1-k)*u(i);
end

如何删除for循环以获得相同的结果?

2 个答案:

答案 0 :(得分:3)

这实际上是一阶IIR过滤器,因此您可以使用filter

u(20:50, 1) = 2;
k = 0.8;
x = filter(1 - k, [1, -k], u);

答案 1 :(得分:0)

如果你为几个值写x(i),你会看到一个模式:

x(1) = 0; % since the loop starts at i=2
x(2) = k*x(1) + (1-k)*u(2)
     = 0      + (1-k)*u(2)
x(3) = k*x(2) + (1-k)*u(3)
     = k*(1-k)*u(2) + (1-k)*u(3)
x(4) = k*x(3) + (1-k)*u(4)
     = k^2*(1-k)*u(2) + k*(1-k)*u(3) + (1-k)*u(4)
...

所以你很容易发现这个模式:

x(i) = (1-k) * sum(k^(i-j)*u(j), j=2..i)

现在是一个显式函数。

你可以应用它来移除你的循环,但实际上这个显式函数本身必须计算一大笔金额。对x的每个索引执行此操作可能比循环和重用先前结果花费更多时间。