1

我有一个归一化概率的 3x3x3 矩阵 (MP)(总和为 1)。当我运行 sample(27,1, MP, replace = T) 时,它返回一个 1 到 27 之间的整数,大概是矩阵的顺序索引。我想知道元素索引方面的哪个矩阵元素(例如行号、列号、z 号)。在构建 N 维数组时(在这种情况下 N=3),如何确定元素的顺序?换句话说,如果我取一个 N 维数组并将所有元素放在一个列表中,我如何将列表映射到 N 维元素?

4

2 回答 2

3

使用whichwith 参数arr.ind=TRUE返回数组索引。

 m <- array((1:27)*10, dim=c(3,3,3))

 x <- sample(27, 1)
 x
 # [1] 20

 which(m == m[x], arr.ind=TRUE)
 #      dim1 dim2 dim3
 # [1,]    2    1    3
于 2013-07-16T03:34:42.447 回答
0

从技术上讲,如果它是二维的,它只是一个矩阵。你所拥有的是一个三维数组。如果你只是尝试:

array( 1:27, dim = c(3, 3, 3) )

, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   10   13   16
[2,]   11   14   17
[3,]   12   15   18

, , 3

     [,1] [,2] [,3]
[1,]   19   22   25
[2,]   20   23   26
[3,]   21   24   27

所以你可以从打印出来的索引中看到对应于哪个顺序值。例如,序列 1:27 中的项目 20 位于 [2, 1, 3]。该序列首先通过列计数,然后是行,然后是矩阵。知道了这一点,您不必担心保留索引。您始终可以重新创建阵列。此外,如果您只想对您的商品进行实际采样,您可以执行以下操作:

y <- array( 1:27, dim = c(3, 3, 3) ) / sum(1:27) # an array like yours
sample(y, 1)

或者,如果您只想打乱整个阵列,您可以尝试sample(y).

顺便说一句,如果你真的想做你似乎表明的事情,在运行 sample use 时sample.int。它具有更高的性能。

于 2013-07-16T03:54:55.293 回答