我有一个多维数组,直到运行时它的维数是未知的,例如:
dims <- rep(3, dim_count)
arr <- array(0, dims)
现在,有了
dims
vector 我想通过数组的所有索引进行迭代,例如,有dims <- c(2,3)
我希望能够获得一系列向量:
c(1,1)
c(1,2)
c(1,3)
c(2,1)
c(2,2)
c(2,3)
或者只是一个从前一个生成下一个的函数。
我能想到的只有三种方法:
1:length(arr)
并将这些数字转换为索引向量 - 在上面的例子中,我会寻找一个(最好是内置的)函数做
indexesOf(arr, 4) -> c(2,1)
. dims
给定的范围内. 但是,遗憾的是,前两种方法都不是快速或优雅的。第三个看起来是个不错的主意,我可以在纸上完成,但我无法使用
rbind
在 R 中对其进行编码等等。有没有这样做的好方法,最好没有嵌套循环?
只是为了比较,我对#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
}
最佳答案
如果我正确地解释了您的请求,那么
as.matrix(do.call(expand.grid,lapply(dim(arr),seq)))
似乎做 #3 ...
关于R 迭代多维数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870392/