首页 > 解决方案 > byrow= R 的矩阵函数中的 TRUE 参数

问题描述

我在某处读到,在创建矩阵时,R 将矩阵的元素作为列主要格式存储在向量中,其中包含有关矩阵维度的附加信息。

如果

matrix(1:6, nrow = 3, ncol = 2)

R 在内部将值存储为 的向量1:6

但是,如果我们设置byrow = TRUE,这是否意味着 R 将值存储为c(1, 3, 5, 2, 4, 6)

标签: rmatrix

解决方案


告诉 R它byrow = TRUE需要操纵输入以使其达到列优先顺序。所以是的,matrix(1:6, nrow = 3, byrow = TRUE)将值存储为1 3 5 2 4 6内部 - 它在创建矩阵之前对它们进行重新排序。

我们可以通过几种方式验证这一点。首先,我们可以比较两个具有相同值的矩阵,一个是用创建的byrow = TRUE,一个不是,看看它们是一样的:

by_col = matrix(1L:4L, 2)
by_row = matrix(c(1L, 3L, 2L, 4L), 2, byrow = TRUE)
identical(by_col, by_row)
# [1] TRUE

我们还可以检查“逐行”矩阵的结构,并看到数据结构中没有任何内容可以跟踪它是用创建的事实byrow = TRUE

# notice the order is 1 2 3 4, not the input order 1 3 2 4
str(by_row)
# int [1:2, 1:2] 1 2 3 4
dput(by_row)
# structure(1:4, .Dim = c(2L, 2L))

有了足够大的矩阵来处理差异,我们可以观察到逐行创建矩阵所需的额外处理时间:

microbenchmark::microbenchmark(
  by_col = matrix(1:1e6, nrow = 1000),
  by_row = matrix(1:1e6, nrow = 1000, byrow = TRUE),
  times = 100
)
# Unit: milliseconds
#    expr       min        lq      mean    median        uq      max neval
#  by_col  2.071366  2.214147  5.943154  4.474175  5.512274 92.49424   100
#  by_row 10.513797 11.112386 15.700628 13.850260 14.485675 98.94681   100

在 1000x1000 矩阵上,创建矩阵需要大约 3 倍的时间byrow,因为 R 需要将数据处理为列主要格式。

最后,如果你想真正有野心,你可以查看用于创建矩阵的 C 源代码,并了解byrow内部如何使用参数。以下是相关线路。我的 C 不是很好,但在我看来byrow = TRUE,在做与byrow = FALSE.


推荐阅读