私はouter
が速いかもしれないと思いますrow(X) * col(X)
。
# Define dimensions
n.rows <- n.cols <- 1000
# Define matrix
X <- matrix(runif(n.rows * n.cols), ncol = n.cols)
# Psidom's approach
rowcol.method <- function(X){row(X) * col(X) * X}
# Approach using outer
outer.method <- function(X){outer(1:nrow(X), 1:ncol(X)) * X}
# Benchmark library
library(microbenchmark)
# Test
microbenchmark(
rowcol.method(X),
outer.method(X)
)
結果:
Unit: milliseconds
expr min lq mean median uq max neval cld
rowcol.method(X) 20.895870 21.154815 23.795695 21.612485 22.584323 62.50660 100 b
outer.method(X) 5.608577 5.729724 6.883643 5.836526 5.977156 50.12508 100 a
比較出力:他の計算のための同様
identical(rowcol.method(X), outer.method(X))
[1] TRUE
、外側アプローチの狂っ外れ値があったが( 221.66718ミリ秒)。
# Define matrix
Y <- row(X) * col(X) * X
# Psidom's approach
rowcol.method.Y <- function(Y) {(Y - mean(Y))^2/(row(Y) * col(Y))}
# Approach using outer
outer.method.Y <- function(Y) {(Y - mean(Y))^2/outer(1:nrow(X), 1:ncol(X))}
# Test
microbenchmark(
rowcol.method.Y(Y),
outer.method.Y(Y)
)
結果:
Unit: milliseconds
expr min lq mean median uq max neval cld
rowcol.method.Y(Y) 27.94405 30.18635 34.63551 33.32627 37.06467 46.58983 100 b
outer.method.Y(Y) 11.27064 12.66349 18.77192 15.66756 18.18864 221.66718 100 a
比較出力:
identical(rowcol.method.Y(Y), outer.method.Y(Y))
[1] TRUE