在第一个找到的实例后替换向量中的元素

时间:2016-01-04 05:11:10

标签: matlab vector indexing

我有一个看起来像

的矢量
V= [24, 25, 26, 27…, 48, 49, 50……, 100, 98, 99, 100, 100, 95, 93, 97, 98, 98, 92….] 

我希望前100 之后的所有元素都为100.我希望前100个之前的所有元素都保持不变。即我不想将24,25,26,27 ... .48,49,50 ... .100更改为100.所以我不能说 - “替换所有元素< 100到100“。

我只想在前100到100之后更改所有元素。

新的矢量看起来像 -

V_new= [24, 25, 26, 27,….., 48, 49, 50, ..., 100, 100, 100, 100, 100, 100, 100, 100]  

我如何在MATLAB中写这个?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

首先将向量V复制到新变量V_new,然后使用find查找值为100的第一个实例。之后,使用此索引和从此后的第一个点到矢量的结尾,将值设置为100:

V_new = V;
ind = find(V == 100, 1, 'first');
V_new(ind+1:end) = 100;

有时使用find有点不受欢迎。我有一个替代方法是使用max并使用第二个输出参数,以便您可以在第一次找到V具有100的元素的情况。然后您可以执行相同的操作和以前一样:

V_new = V;
[~,ind] = max(V == 100);
V_new(ind+1:end) = 100;

答案 1 :(得分:3)

这是一个简单的单行:

onLocationChanged()

例如考虑

V(cumsum(V==100) > 0) = 100;

现在

>V = [ 8 2 6 1 6 3 ]

逐一打破这个

n = 6;
V(cumsum(V==n) > 0) = n;

产生一个逻辑矩阵,找到V==n 等于V的任何元素,即:

n
然后我们找到累积总和,即0 0 1 0 1 0

cumsum(V==n)

最后,我们看一下这个总和大于0 0 1 1 2 2 的位置。并不是它会单调增加,而是总是会增加1的步长,因为它是在逻辑矩阵上调用的。所以1

cumsum(V==n) > 0

这些是您想要更改的元素,只是将其用作0 0 1 1 1 1 的逻辑索引,因此VV(cumsum(V==n)>0)相同