Matlab 如何将延迟应用于信号的循环矢量化?
以下代码是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个值,在循环的上一次迭代中修改。
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应用卷积来获得任何速度吗ctorB
和一阶系统的脉冲响应
非常感谢您的帮助!循环后存储在
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一点问题都没有!我想我理解你提出的解决方案背后的想法:我会根据我的具体情况,同时尽量不要弄乱符号!)