r - byrow= R 的矩阵函数中的 TRUE 参数
问题描述
我在某处读到,在创建矩阵时,R 将矩阵的元素作为列主要格式存储在向量中,其中包含有关矩阵维度的附加信息。
如果
matrix(1:6, nrow = 3, ncol = 2)
R 在内部将值存储为 的向量1:6
。
但是,如果我们设置byrow = TRUE
,这是否意味着 R 将值存储为c(1, 3, 5, 2, 4, 6)
?
解决方案
告诉 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
.
推荐阅读
- javascript - 为什么当我尝试读取 object[key].value 时出现未定义?
- python - 查找给定角色中的所有用户 discord.py
- xamarin.forms - 如何从 ParseObject 的子类中的相关用户获取数据?
- ansible - 需要帮助循环通过 Ansible msg 输出
- swift - 如何在 Combine 中最好地创建 @Published 值的发布者聚合?
- python - 如何在 Python 中解压缩复合文件
- python - 从版本 0.8.2 更新到 0.9 时 Geopandas 性能损失
- python-2.7 - 无法在我的 docker 映像上运行 pytest,“无效语法”
- r - 分类变量
- javascript - Joi 验证数小于提供的输入无法正常工作