R、NULL対NAで行列を割り当てる最良の方法を投稿していますか? は、R で独自の行列割り当て関数を記述すると、R の組み込みの matrix() 関数を使用して大きな行列を事前に割り当てるよりも 8 倍から 10 倍高速になることを示しています。
手作りの関数がなぜそんなに速いのか誰か知っていますか? R は非常に遅い matrix() 内で何をしているのですか? ありがとう。
私のシステムのコードは次のとおりです。
create.matrix <- function( nrow, ncol ) {
x<-matrix()
length(x) <- nrow*ncol
dim(x) <- c(nrow,ncol)
x
}
system.time( x <- matrix(nrow=10000, ncol=9999) )
user system elapsed
1.989 0.136 2.127
system.time( y <- create.matrix( 10000, 9999 ) )
user system elapsed
0.192 0.141 0.332
identical(x,y)
[1] TRUE
上記のリンクの回答に投稿されている内容が一貫していないため、ユーザー定義関数が遅いと考えてコメントした人に謝罪します。上記のリンクでは約 8 倍高速であり、私のシステムでは、ユーザー定義と組み込みの場合で約 10 倍高速です。
Joshua のセッション情報のリクエストに応じて:
> sessionInfo()
R version 2.12.1 (2010-12-16)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=C LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] tools_2.12.1
また、Simon の 3 つの例を実行してみましたが、Simon が最速として挙げた 3 番目の例は、私にとっては最も遅いことがわかりました。
> system.time(matrix(NA, nrow=10000, ncol=9999))
user system elapsed
2.011 0.159 2.171
> system.time({x=NA; length(x)=99990000; dim(x)=c(10000,9999); x})
user system elapsed
0.194 0.137 0.330
> system.time(matrix(logical(0), nrow=10000, ncol=9999))
user system elapsed
4.180 0.200 4.385
matrix()
ただし、最初に 1x1 マトリックスを割り当ててからコピーするというアイデアで、サイモンは正しい方向に進んでいる可能性があると私は今でも考えています。R の内部に関する優れたドキュメントを知っている人はいますか? ありがとう。