我有一个多维数组,其维度的数量在运行时之前是未知的,例如:
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:length(arr)并将这些数字转换为
索引向量 – 在上面的例子中,我将寻找一个(最好是内置的)函数做indicesOf(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 ……