如何在R中检测向量中的循环

如何在R中检测向量中的循环,r,convergence,R,Convergence,假设我有以下向量: vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28) 您会注意到有三个重复元素(25、24和28)。当向量中存在重复元素(或循环)时,如何让R识别?无论有多少元素在重复(2或5而不是3),也不管向量中有多少元素开始,我都要检测到这一点 在上下文中,我有一个算法试图收敛于一个值,但有时它会陷入这个重复循环中。我想让R探测到它什么时候卡在这个无限循环中,然后离开。在我的示例中,ve

假设我有以下向量:

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28)
您会注意到有三个重复元素(25、24和28)。当向量中存在重复元素(或循环)时,如何让R识别?无论有多少元素在重复(2或5而不是3),也不管向量中有多少元素开始,我都要检测到这一点

在上下文中,我有一个算法试图收敛于一个值,但有时它会陷入这个重复循环中。我想让R探测到它什么时候卡在这个无限循环中,然后离开。在我的示例中,
vec
是每次迭代时的值日志


我已经想出了如何捕获双重重复元素(保存上一次迭代的值以与当前迭代进行比较),但这3个以上的重复元素让我感到困惑。

在运行分析之前,请使用该方法。如果返回向量的长度为0,则不存在重复项。

这可能有效:

如果我允许
vec
运行更长的时间:

vec = c(29, 30, 15, 29, 17, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28, 25, 24, 28)
然后我可以用这个找到10个元素长的循环。通过更改
10
可以合并更长的周期,但我希望我永远都不用处理这个问题

any(sapply(1:10, function(i) all(tail(diff(vec, lag = i), 10) == 0)))

此函数将查找重复2次的模式。我用[I+1]计算元素[I]对的散列,方法是将第二个元素乘以“100”,再加上第一个元素。您可以将该因子更改为其他数字,前提是您的整数以该因子为界。您可能希望将其更改为1000000。如果您有大整数,您可能需要重新考虑这个问题

然后我要确保散列都是唯一的,即从[I]到[I+1]的转换只发生一次

hasCycle <- function(v) {
  hash <- v[1:length(v)-1] + 100 * v[2:length(v)]
  length(unique(hash)) != length(hash)
}

好主意。不过,我不希望它捕捉到碰巧重复的值,即使它们不是重复模式的一部分。我已经更新了上面的
vec
。我不想
29
被标记。你怎么知道
29
不是一种模式,而是
25,24,28
是一种模式?你是说一个图案必须有2个或更多的重复元素吗?如果是这样,那么您只需要查找2个重复元素。我感兴趣的是查找大于length=1的重复元素(循环)。因此,在第一种情况下,
29
后面跟着
30
,而在第二种情况下,后面跟着
17
。因此,在这种情况下,
29
不是循环的一部分。“循环”可能是比“重复元素”更好的描述——向量是通过函数迭代获得的吗?如果是这样的话——你也许可以使用Floyd的循环查找算法()Hmmm。你知道Floyd算法的R代码吗?
> a <- c(1, 2,3,4,5,1,6,7)
> hasCycle(a)
[1] FALSE
> 
> b <- c(1, 2,3,4,5,9,7,3,4)
> hasCycle(b)
[1] TRUE