我读到某个地方,当创建矩阵时,R将向量中的矩阵元素作为列主格式存储,其中包含有关矩阵尺寸的其他信息。
如果
matrix(1:6, nrow = 3, ncol = 2)
R在内部将值存储为1:6
的向量。
但是,如果我们设置byrow = TRUE
,是否表示R将值存储为c(1, 3, 5, 2, 4, 6)
?
答案 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
相同的操作。>