R是按行填充矩阵还是转置由列填充矩阵的速度更快?

问题描述 投票:0回答:1

[我读到R使用矩阵中的主列存储,这意味着附近的列中的元素存储在连续的块或类似的块中。这让我感到奇怪:是按行填充矩阵更快(使用基本R函数byrow=TRUE中的matrix())还是先按列填充矩阵(使用默认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()做一些重新标记,但实际上比按行填充矩阵要慢!

对此有解释吗?我很困惑。

r performance matrix benchmarking microbenchmark
1个回答
0
投票

我认为这取决于列数和行数之间的关系:

  • 行数>列数
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
  • 行数
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
© www.soinside.com 2019 - 2024. All rights reserved.