Matlab 如何将延迟应用于信号的循环矢量化?

Matlab 如何将延迟应用于信号的循环矢量化?,matlab,vectorization,delay,Matlab,Vectorization,Delay,以下代码是MATLAB函数的一部分,该函数旨在计算一阶延迟系统的输出。它采用向量B(即“输入”或强制功能),并用于构建输出向量a,这是一阶系统的响应: for I=2:length(A) A(I) = A(I-1) + ( 1-exp(-tau(I)*dt) ) .* ( B(I)-A(I-1) ); end A恰好是一个大向量,作为优化例程的一部分,循环被执行数千次。循环的目的是基于向量tau、B的值以及(I-1)的值来“延迟”存储在A中的信号A的第n个值,在循环的上一次迭代中修改。

以下代码是MATLAB函数的一部分,该函数旨在计算一阶延迟系统的输出。它采用向量
B
(即“输入”或强制功能),并用于构建输出向量
a
,这是一阶系统的响应:

for I=2:length(A)
    A(I) = A(I-1) + ( 1-exp(-tau(I)*dt) ) .* ( B(I)-A(I-1) );
end
A
恰好是一个大向量,作为优化例程的一部分,循环被执行数千次。循环的目的是基于向量
tau
B
的值以及(I-1)的值来“延迟”存储在A中的信号A的第n个值,在循环的上一次迭代中修改。
tau
B
的元素数与
A
相同

有没有一种方法可以利用矢量化并完全避免循环?我想我可以利用这样一个事实,即一阶系统对单位阶跃或单位斜率的响应可以用相对简单的术语来表示,使用
tau
B
:我会通过尝试对输入ve应用卷积来获得任何速度吗ctor
B
和一阶系统的脉冲响应


非常感谢您的帮助!

循环后存储在
A
中的值将仅取决于
tau
B
A(1)的值
。这是有意的吗?特别是,如果您多次运行循环而不更改
B
tau
它将不会更改
A
。要对循环进行向量化,我建议替换
T(I)=-exp(-tau(I)*dt
,以及
C(I)=(1+T(I)).*B(I)
(两者都是可向量化的)。这样,你的公式就简化为
A(I)=A(I-1)*T(I)+C(I)
。如果你对前几个
I
展开该表达式,你很快就会注意到如何将其表示为
cumprod
cumsum
@chtz的组合,谢谢你的回答。循环的行为与预期一致。我应该提到
A(1)
tau
B
在循环发生之前在其他地方更新。因此,
A
实际上在每次执行该部分代码时都会发生变化。但我完全明白你为什么要问这个问题!我喜欢你在应用矢量化之前简化表达式的想法:我会尝试一下,然后发布r结果!谢谢!我想我犯了一些符号错误,仔细检查了公式(我故意没有将此作为答案提交…@chtz一点问题都没有!我想我理解你提出的解决方案背后的想法:我会根据我的具体情况,同时尽量不要弄乱符号!)