【问题标题】:Max Series of Consecutive Numbers最大连续数系列
【发布时间】:2013-07-14 19:41:14
【问题描述】:

我需要帮助找到一种方法来做到这一点,尽管它看起来应该很简单。假设我有一个 nx1 数组。例如,让X=[1 1 1 .5 .4 .2 -.2 -.3 1 1 0 1]。我要做的是找到最大的连续1 系列的开始位置以及其中有多少1。例如,使用X,最大的连续系列从索引 1 开始,长度为 3。另外,我将使用非常大的数据集,所以我想尝试找到最有效和最快的方法这是可以做到的。

【问题讨论】:

标签: arrays matlab


【解决方案1】:

这是一种可以相当有效地完成此任务的方法:

x = [1 1 1 0.5 0.4 0.2 -0.2 -0.3 1 1 0 1];
x1 = (x==1);
d = diff(x1(:).');
start = find([x1(1) d]==1)
len = find([d -x1(end)]==-1)-start+1

返回

start =

     1     9    12

len =

     3     2     1

【讨论】:

  • 我调整了代码,使其适用于行向量和列向量输入。
  • 不,我只是通过列向量。但是,即使列中有连续的 1,循环也会返回空矩阵。
  • 例如什么向量?你确定这些值实际上是==1,而不是被某个 epsilon 关闭吗?如果它们非常接近1,那么您应该能够在我上面的代码中调整x1 的等式以包含一个小的容差。
  • 谢谢!通过将其调整为 x>=.9 来实现。非常感谢您的帮助。
  • 很高兴听到。更通用的解决方案是x1 = (abs(x-1)<tol);,它允许您根据需要指定容差值tol
【解决方案2】:

这样的功能可以提供帮助

function [start, len] = findLongestRunning(x)
y = find(diff([0;x(:)==1;0]));
[len,J] = max(y(2:2:end)-y(1:2:end));
start = y(2*J(1)-1);
end

在你的例子上运行

>> [start, len] = findLongestRunning(x)
start =
     1
len =
     3

请注意,如果有多个满足要求的序列,则代码返回第一次出现:

>> [start, len] = findLongestRunning([x 0 x])
start =
     1
len =
     3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2021-01-21
    • 2020-01-22
    相关资源
    最近更新 更多