4

次の行列を考えてみましょう。

nc <- 5000
nr <- 1024
m <- matrix(rnorm(nc*nr), ncol=nc)

rowMeansこの行列でランダムに取得された同じサイズの2つのグループの違いを取得したいと思います。

n <- 1000 # group size

system.time(replicate(100, {
   ind1 <- sample(seq.int(nc), n) 
   ind2 <- sample(seq.int(nc), n)
   rowMeans(m[, ind1]) - rowMeans(m[, ind2])
}))

かなり遅いですが、残念ながらRprofの出力がわかりませんでした(ほとんどの時間が費やされたようですis.data.frame??)

より効率的なものの提案?

私は次のことを考えました:

  • Rcpp:私のオンライン測定値から、RのrowMeansは非常に効率的であると信じているので、このステップで役立つかどうかは明らかではありません。ボトルネックが実際にどこにあるのかを確信したいのですが、おそらく私のデザイン全体が最適ではありません。小さい行列ごとにコピーを作成するのにほとんどの時間が費やされている場合、Rcppのパフォーマンスは向上しますか?

  • R-develにアップデートすると、.rowMeansさらに効率的な新機能があるようです。誰かがそれを試しましたか?

ありがとう。

4

2 に答える 2

7

からの列のサブセットに対する各rowSums()呼び出しは、とのm間の行列乗算、mおよび選択された列のベクトル0または1選択された列を示すものと見なすことができます。これらすべてのベクトルを並置すると、2つの行列間の乗算になります(これははるかに効率的です)。

ind1 <- replicate(100, seq.int(nc) %in% sample(seq.int(nc), n)) 
ind2 <- replicate(100, seq.int(nc) %in% sample(seq.int(nc), n))
output <- m %*% (ind1 - ind2)
于 2012-02-28T02:15:53.673 に答える
4

に2回呼び出す必要はありませんrowMeans。最初に減算を実行しrowMeansて、結果を呼び出すことができます。

x1 <- rowMeans(m[,ind1])-rowMeans(m[,ind2])
x2 <- rowMeans(m[,ind1]-m[,ind2])
all.equal(x1,x2)
# [1] TRUE

is.data.frameで行われるチェックの一部ですrowMeans

更新:.rowMeansR-develに関しては、内部コードへの直接の呼び出しのように見えます(do_colsum変更されていないことを前提としています)。それは次のように定義されます:

.rowMeans <- function(X, m, n, na.rm = FALSE)
    .Internal(rowMeans(X, m, n, na.rm))

あなたの場合、m=1024そしてn=1000

于 2012-02-28T01:19:33.813 に答える