我正在阅读R
使用矩阵中的以列为主的存储,这意味着附近列中的元素存储在连续的块或类似的块中。这让我想知道:是更快地按行填充矩阵(byrow=TRUE
在base R函数中使用matrix()
),还是先快地按列填充矩阵(使用default byrow=FALSE
),然后使用进行转置t()
?
我尝试进行基准测试。
> microbenchmark(matrix(1, n, n, byrow=TRUE))
Unit: seconds
expr min lq mean median uq max neval
matrix(1, n, n, byrow = TRUE) 1.047379 1.071353 1.105468 1.081795 1.112995 1.628675 100
> microbenchmark(t(matrix(1, n, n)))
Unit: seconds
expr min lq mean median uq max neval
t(matrix(1, n, n)) 1.43931 1.536333 1.692572 1.61793 1.726244 3.070821 100
似乎逐行填充矩阵更快!我想念什么吗?我本以为这样R
做只会做一些重新标记,t()
但实际上比逐行填写矩阵要慢!
对此有解释吗?我很困惑。
经过ThomasIsCoding的回答,并且对自己进行了几次基准测试之后,看起来它取决于行数和列数。
t()
更快。byrow=TRUE
更快。byrow=TRUE
更快。我认为这取决于列数和行数之间的关系。
应该注意的是,在“按列填充矩阵然后转置矩阵”的方法中,按行填充更快,但是转置是速度的瓶颈。
n <- 1e5
m <- 1e3
microbenchmark(matrix(1, n, m, byrow=TRUE),
t(matrix(1, m, n)),
check = "equal",
unit = "relative",
times = 10)
这样
Unit: relative
expr min lq mean median uq max neval
matrix(1, n, m, byrow = TRUE) 1.00000 1.000000 1.000000 1.000000 1.000000 1.000000 10
t(matrix(1, m, n)) 3.57835 3.556422 3.935004 3.583247 3.714243 4.820607 10
和
> # fill by row
> system.time(x <- matrix(1, n, m, byrow=TRUE))
user system elapsed
0.48 0.08 0.61
> # fill by column
> system.time(y <- matrix(1, m, n))
user system elapsed
0.03 0.14 0.17
> # transpose
> system.time(t(y))
user system elapsed
1.59 0.08 1.71
n <- 1e3
m <- 1e5
microbenchmark(matrix(1, n, m, byrow=TRUE),
t(matrix(1, m, n)),
check = "equal",
unit = "relative",
times = 10)
这样
Unit: relative
expr min lq mean median uq max neval
matrix(1, n, m, byrow = TRUE) 1.885902 1.893168 1.717817 1.730453 1.744869 1.480463 10
t(matrix(1, m, n)) 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 10
和
> # fill by row
> system.time(x <- matrix(1, n, m, byrow=TRUE))
user system elapsed
0.92 0.39 1.33
> # fill by column
> system.time(y <- matrix(1, m, n))
user system elapsed
0.13 0.08 0.20
> # transpose
> system.time(t(y))
user system elapsed
0.47 0.10 0.58
n <- 1e4
m <- 1e4
microbenchmark(matrix(1, n, m, byrow=TRUE),
t(matrix(1, m, n)),
check = "equal",
unit = "relative",
times = 10)
这样
Unit: relative
expr min lq mean median uq max neval
matrix(1, n, m, byrow = TRUE) 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 10
t(matrix(1, m, n)) 1.163218 1.197249 1.279579 1.178185 1.354539 1.387548 10
和
> # fill by row
> system.time(x <- matrix(1, n, m, byrow=TRUE))
user system elapsed
1.18 0.18 1.47
> # fill by column
> system.time(y <- matrix(1, m, n))
user system elapsed
0.08 0.10 0.17
> # transpose
> system.time(t(y))
user system elapsed
2.47 0.14 2.63
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句