多次元配列があり、その次元数は実行時まで不明です。次に例を示します。
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)
または、前の関数から次の関数を生成する関数です。
私が考えることができた唯一の3つの方法は次のとおりでした:
繰り返して
1:length(arr)
、それらの数値をインデックスベクトルに変換します-上記の例では、(できれば組み込みの)関数を探していindexesOf(arr, 4) -> c(2,1)
ます。最後に生成されたインデックスベクトルを取得し、要素を最後の位置でインクリメントし、それがで指定された範囲内にあることを確認し
dims
ます。行列を生成します。その列には、必要なすべてのインデックスが含まれます。
しかし、悲しいことに、最初の2つのアプローチはどちらも高速でもエレガントでもありません。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
}