向量化 Matlab 从头到尾替换数组值

Vectorizing Matlab replace array values from start to end

我有一个数组,我想用它前面的值替换一组已知索引处的值。例如,我的数组可能是

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];

并且要被先前值替换的值的索引可能是

y = [2, 3, 8];

我希望这个替换从左到右发生,或者从头到尾发生。也就是说,索引 2 处的值应该被索引 1 处的值替换,before 索引 3 处的值被索引 2 处的值替换。使用上面数组的结果应该是

[1, 1, 1, 4, 5, 6, 7, 7, 9, 0]

但是,如果我使用明显的方法在 Matlab 中实现这一点,我的结果是

>> x(y) = x(y-1)

x =

     1     1     2     4     5     6     7     7     9     0

希望你能看到这个操作是从右到左执行的,索引 3 的值被索引 2 的值替换,然后 2 被 1 替换。

我的问题是:有没有什么方法可以通过简单的方式实现我想要的结果,而不用蛮力循环遍历数组或做一些耗时的事情,比如反转数组?

好吧,实际上这是一个循环,但顺序是连续索引元素的数量

while ~isequal(x(y),x(y-1))
  x(y)=x(y-1)
end

使用提供的 nancumsum you can achieve a fully vectorized version. Nevertheless, for most cases the solution 可能是首选。仅适用于 y 中长序列的极端情况,此代码更快。

c1=[0,diff(y)==1];
c1(c1==0)=nan;
shift=nancumsum(c1,2,4);
y(~isnan(shift))=y(~isnan(shift))-shift(~isnan(shift));
x(y)=x(y-1)