【问题标题】:Replacing elements in a vector after the first found instance在第一个找到的实例之后替换向量中的元素
【发布时间】:2016-11-25 17:23:11
【问题描述】:

我有一个看起来像

的向量
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 个。

新向量看起来像--

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

如何在 MATLAB 中编写此代码?任何人都可以帮忙吗?

【问题讨论】:

  • 如果其中一个答案解决了您的问题,请点击复选标记考虑accepting it。这表明您已经找到了解决方案,这不再是一个悬而未决的问题。如果您的问题没有得到解答,请说明缺少的内容。

标签: matlab vector indexing


【解决方案1】:

首先将向量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;

【讨论】:

  • 在这种情况下,使用max 肯定比find 更可取。 find 不受欢迎,因为它经常用于逻辑索引足够且无关紧要的地方。
  • @Dan 我想不是,但很高兴能想出一个替代方案。
  • @Aditya 如果您不再需要帮助,请考虑接受我们的答案之一。祝你好运!
【解决方案2】:

这是一个简单的单行:

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)V([0 0 1 1 1 1]) 相同

【讨论】:

  • 这个答案可以从解释中受益。正如所发布的,它只对那些已经知道答案的人有帮助。
  • @IInspectable 我不同意你的观点,但无论如何我都添加了解释。在 MATLAB 中,即使他们还不知道答案,只需在命令行中键入一行代码的每一部分并立即查看结果是什么。
猜你喜欢
  • 2018-07-23
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多