向量化 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)
我有一个数组,我想用它前面的值替换一组已知索引处的值。例如,我的数组可能是
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)