我有一个看起来像
的矢量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中写这个?有人可以帮忙吗?
答案 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
的逻辑索引,因此V
与V(cumsum(V==n)>0)
相同