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

时间:2015-11-30 22:52:37

标签: arrays matlab vectorization indices

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

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

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

y = [2, 3, 8];

我希望这个替换从左到右发生,否则从头到尾。也就是说,索引2处的值应替换为索引1处的值,之前索引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替换。

我的问题是:有没有办法以一种简单的方式实现我想要的结果,没有强力循环阵列或做一些耗时的事情,比如反转阵列?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:4)

使用nancumsum可以实现完全矢量化版本。然而,对于大多数情况,提供的解决方案karakfa可能是首选。仅适用于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)