R的矩阵函数中的byrow = TRUE自变量

时间:2018-07-10 00:40:00

标签: r matrix

我读到某个地方,当创建矩阵时,R将向量中的矩阵元素作为列主格式存储,其中包含有关矩阵尺寸的其他信息。

如果

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

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

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

1 个答案:

答案 0 :(得分:3)

byrow = TRUE告诉R它需要操纵输入以使其达到列大顺序。因此,是的,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的矩阵上,创建矩阵byrow所需的时间大约是原来的3倍,因为R需要将数据处理为列主格式。

最后,如果您想变得野心勃勃,可以浏览C源代码以创建矩阵,并了解内部如何使用byrow参数。 Here are the relevant lines。我的C语言不是很好,但是在我看来byrow = TRUE只是做了一些额外的处理,将输入重新排序为列大顺序,然后再执行与byrow = FALSE相同的操作。