4

我有一个多维数组,直到运行时它的维数是未知的,例如:

dims <- rep(3, dim_count)
arr <- array(0, dims)

现在,有了dims向量,我想通过数组的所有索引进行迭代,例如,有

dims <- c(2,3)

我希望能够得到一系列向量:

c(1,1)
c(1,2)
c(1,3)
c(2,1)
c(2,2)
c(2,3)

或者只是一个从前一个生成下一个的函数。

我能想到的唯一三种方法是:

  1. 迭代1:length(arr)并将这些数字转换为索引向量-在上面的示例中,我将寻找一个(最好是内置的)函数来执行indexesOf(arr, 4) -> c(2,1).

  2. 获取最后生成的索引向量,在其最后一个位置增加元素,并确保它在 给定的范围内dims

  3. 生成一个矩阵,其中的列将包含我需要的所有索引。

但是,遗憾的是,前两种方法都不是快速或优雅的。第三个看起来不错的主意,我可以在纸上做,但我不能在 R 中使用rbind,等等。

有没有这样做的好方法,最好没有嵌套循环?

只是为了比较,我丑陋的#3循环实现:

getAllIndexes = function(dims) {
  dimCount <- length(dims)
  ret <- array(1:dims[1], c(1,dims[1]))
  for(i in 2:length(dims)){
    curdims <- dims[i]

    a <- array(rep(ret, curdims), c(nrow(ret), curdims * ncol(ret) ))
    b <- rep(1:curdims, each=ncol(ret))
    ret <- rbind(a, b, deparse.level=0)
  }
  ret
}
4

1 回答 1

2

如果我正确解释了您的请求,那么

as.matrix(do.call(expand.grid,lapply(dim(arr),seq)))

似乎做#3 ...

于 2012-06-03T13:01:15.877 回答