gpt4 book ai didi

r - 按行填充矩阵或转置按列填充的矩阵更快吗?

转载 作者:行者123 更新时间:2023-12-05 08:51:33 25 4
gpt4 key购买 nike

我读到 R 在矩阵中使用列优先存储,这意味着相邻列中的元素存储在连续 block 或类似的东西中。这让我想知道:按行填充矩阵更快(在基本 R 函数 matrix() 中使用 byrow=TRUE)还是首先按列填充矩阵更快(使用默认的 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

关于r - 按行填充矩阵或转置按列填充的矩阵更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59536834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com