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)

または、前の関数から次の関数を生成する関数です。

私が考えることができた唯一の3つの方法は次のとおりでした:

  1. 繰り返して1:length(arr)、それらの数値をインデックスベクトルに変換します-上記の例では、(できれば組み込みの)関数を探していindexesOf(arr, 4) -> c(2,1)ます。

  2. 最後に生成されたインデックスベクトルを取得し、要素を最後の位置でインクリメントし、それがで指定された範囲内にあることを確認しdimsます。

  3. 行列を生成します。その列には、必要なすべてのインデックスが含まれます。

しかし、悲しいことに、最初の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
}
4

1 に答える 1

2

私があなたの要求を正しく解釈しているなら、

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

#3を行うようです..。

于 2012-06-03T13:01:15.877 に答える