我在某处读到,当创建矩阵时,R将矩阵的元素以向量的形式存储为列主格式,并带有关于矩阵维度的附加信息。
如果
matrix(1:6, nrow = 3, ncol = 2)R在内部将值存储为1:6的向量。
但是,如果我们设置byrow = TRUE,这是否意味着R将值存储为c(1, 3, 5, 2, 4, 6)
发布于 2018-07-10 11:11:09
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我们还可以检查"by-row“矩阵的结构,并看到数据结构中没有任何内容记录了它是用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 = FALSE相同的事情之前,byrow = TRUE只是做了一些额外的处理,将输入重新排序为以列为主的顺序。
https://stackoverflow.com/questions/51255759
复制相似问题