我有一个13维数组:MatrixQ
如何在循环中引用它的第i个维度?
对于(1:13中的i){我想将数字i分配给数组的第i个维度}我应该使用什么命令?谢谢,
据我所知,在R中没有简单的方法。但是,您可以利用以下事实:数组实际上是作为具有维度(dim
)属性的向量存储的。因此,您实际上可以直接访问元素,而无需使用多个逗号。困难在于确定基础向量的哪些索引表示所需数组的切片。这只需要一点数学。
我认为您正在寻找这样的东西:
at <- function(array = a, d = 1, slice = 1)
{
consec <- cumprod(c(1, dim(a)))[-(length(dim(a)) + 1)]
skip_n <- consec * (dim(a) - 1)
basic_pattern <- rep_len(c(rep(TRUE, consec[d]), rep(FALSE, skip_n[d])), length(a))
which(c(rep(FALSE, consec[d] * (slice - 1)), basic_pattern)[seq_along(a)])
}
这里是使用方法。从数组开始(让我们只有3维)
my_array <- array(0, dim = c(2, 3, 4))
my_array
#> , , 1
#>
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
#>
#> , , 2
#>
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
#>
#> , , 3
#>
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
#>
#> , , 4
#>
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
现在,我可以像下面这样获取表示三维第二维矩阵(即my_array[, , 2]
)的基础数组的索引:
at(my_array, 3, 2)
# [1] 7 8 9 10 11 12
这意味着如果我将任何内容写入my_array[c(7, 8, 9, 10, 11, 12)]
,它将改变矩阵的适当切片中的元素:
my_array[at(my_array, 3, 2)] <- 69
my_array
#> , , 1
#>
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
#>
#> , , 2
#>
#> [,1] [,2] [,3]
#> [1,] 69 69 69
#> [2,] 69 69 69
#>
#> , , 3
#>
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
#>
#> , , 4
#>
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
当然,这意味着我们可以执行一个循环来选择尺寸。在这里,我们首先将my_array重置为零,然后将维度编号放入该维度内第一个切片的每个元素中。请注意,如果某些单元格属于多维的第一个切片,则在该过程中将被覆盖。
# Reset my_array first
my_array[] <- 0
for(i in 1:3)
{
my_array[at(my_array, i, 1)] <- i;
}
my_array
#> , , 1
#>
#> [,1] [,2] [,3]
#> [1,] 3 3 3
#> [2,] 3 3 3
#>
#> , , 2
#>
#> [,1] [,2] [,3]
#> [1,] 2 1 1
#> [2,] 2 0 0
#>
#> , , 3
#>
#> [,1] [,2] [,3]
#> [1,] 2 1 1
#> [2,] 2 0 0
#>
#> , , 4
#>
#> [,1] [,2] [,3]
#> [1,] 2 1 1
#> [2,] 2 0 0
尽管该示例适用于3-D阵列,但它适用于任意数量的尺寸。