高维数组

问题描述 投票:0回答:1

我有一个13维数组:MatrixQ

如何在循环中引用它的第i个维度?

对于(1:13中的i){我想将数字i分配给数组的第i个维度}我应该使用什么命令?谢谢,

r arrays loops dimension
1个回答
0
投票

据我所知,在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阵列,但它适用于任意数量的尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.