0

我想在数组中找到特定的数字序列。举个例子,假设我想找到两个数字7的序列,即c(7,7)。

取矩阵 M,其中

set.seed(100)
M = matrix(sample(10,100,replace = T), nrow = 10)

如果您运行代码,M[5,4] 和 M[5,5] 都等于 7。所以矩阵 M 的序列确实等于我正在寻找的序列。

结果,我想知道序列所在行的索引,因此,我的答案是 5。为了使它更好,我想知道序列开始的列。在这种情况下,这将是 4。

我在 StackOverflow 上找到了与此主题相关的两个答案。问题 1问题 2

问题 1 是关于在数组中查找序列。我尝试将给出的解决方案与一个apply函数结合起来,如

apply(M, 1, *solution from Question 1*)

但它没有成功。

问题 2 似乎做了我想做的事,但它在 HPH 中,我没有完全掌握代码。

为此,我正在使用 R。感谢您的反馈。

4

1 回答 1

1

矩阵或数组中项目的排序是“列优先”,因此如果您想要在列和行中都出现的序列,则需要测试原始矩阵及其转置。

> which(diff(M)==0)
[1]  5 17 48 61 68 75
> which(diff(t(M))==0)
[1]  5  7  8 35 40 64 90
> M
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    4    7    6    5    4    4    5    5    5    10
 [2,]    3    9    8   10    9    2    7    4    6     3
 [3,]    6    3    6    4    8    3   10    6   10     4
 [4,]    1    4    8   10    9    3    7   10   10     5
 [5,]    5    8    5    7    7    6    5    7    1    10
 [6,]    5    7    2    9    5    3    4    7    6     4
 [7,]    9    3    8    2    8    2    5    9    8     6
 [8,]    4    4    9    7    9    3    5    8    3     2
 [9,]    6    4    6   10    3    6    3    9    4     1
[10,]    2    7    3    2    4    3    7    1    8     8

第一个结果中的“5”指的是位置 [5:6,1] 中的 5,而在转置 M 上完成的 5 指的是位置 [1, 5:6] 中的 4。您询问的相邻 7 由第二个结果中的 35 标识。

你可能想看看这两个矩阵。如果您希望将结果与原始结果“对齐”,则可以在第二个末尾添加 FALSE 列,并在第一个下方添加 FALSE 行:

 t(diff(t(M))==0)
       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]
 [1,] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
 [5,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
 [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [8,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
> diff(M)==0
       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
 [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
 [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [5,]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
 [6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [7,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
 [8,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
于 2018-06-21T22:15:16.343 回答