如何在Matlab中有效地对完全矢量化的时间序列进行校正

如何在Matlab中有效地对完全矢量化的时间序列进行校正,matlab,performance,for-loop,vectorization,Matlab,Performance,For Loop,Vectorization,我面临一个计算效率问题。我有一个非单调漂移变量的时间序列,即在生产线中通过机器(进行测量)的对象的测量值。要做的工作包括模拟如果每次测量漂移超过或低于阈值时对对象进行校正,该时间序列将产生什么结果 要做到这一点,我可以简单地为循环创建一个,每次越过阈值时,我都会对时间序列的其余部分进行校正。但是,时间序列非常长,并且for的循环需要花费太多时间进行计算。我想把这段代码矢量化,使它更高效。有人看到了这样做的方法吗 下面是一个使用for循环的工作示例: ts = [1 2 3 4 3 2 1 0 -

我面临一个计算效率问题。我有一个非单调漂移变量的时间序列,即在生产线中通过机器(进行测量)的对象的测量值。要做的工作包括模拟如果每次测量漂移超过或低于阈值时对对象进行校正,该时间序列将产生什么结果

要做到这一点,我可以简单地为循环创建一个
,每次越过阈值时,我都会对时间序列的其余部分进行校正。但是,时间序列非常长,并且
for的
循环需要花费太多时间进行计算。我想把这段代码矢量化,使它更高效。有人看到了这样做的方法吗

下面是一个使用
for
循环的工作示例:

ts = [1 2 3 4 3 2 1 0 -1 -2 -3];
threshold = [-3.5 3];
correction = [1 -1];
for i = 1:numel(ts)
    if ts(i) > threshold(2)
       ts(i:end) = ts(i:end) + correction(2);
   elseif ts(i) < threshold(1)
       ts(i:end) = ts(i:end) + correction(1);
   end
end
disp(ts)

如何将此问题矢量化?

您应该使用布尔掩码来过滤不满足条件的数据点。这里没有可调试的代码。问题是做这项工作的最佳算法策略是什么(除了简单的for循环)。创建一个“最小的、完整的、可验证的示例”是没有意义的。感谢MLGY的评论。问题是,我一次应用一个校正,一个校正会影响时间序列的其余部分,因此在进行校正之前,不满足条件的第二个点可能会在执行校正后满足它,以校正第一个点。所以布尔掩码只与第一次修正相关。因此,我们回到for循环策略。我从您的问题中删除了[python]标记,因为该问题现在包含MATLAB代码;我投票决定重新开张。@GertArnold你的陈述的前半部分是不正确的。仅仅因为现有的代码没有bug并不意味着这个问题就偏离了主题。
[1 2 3 3 2 1 0 -1 -2 -3 -3]