我遇到了以下问题:我需要从一个大矩阵中获取许多子集。实际上,我只需要作为另一个函数 f() 的输入视图,因此我不需要更改值。然而,似乎 R 在这个任务上非常慢,或者我做错了什么(后者更可能)。玩具示例说明了选择列所需的时间以及在另一个函数中使用它们的时间(在这个玩具示例中是原始函数 sum())。作为“基准测试”,我还测试了将整个矩阵相加所需的计算时间,这是出人意料的快。我还尝试使用 ref 包,但无法获得任何性能增益。因此,关键问题是如何对矩阵进行子集处理而不复制它?感谢任何帮助!
library(microbenchmark)
library(ref)
m0 <- matrix(rnorm(10^6), 10^3, 10^3)
r0 <- refdata(m0)
microbenchmark(m0[, 1:900], sum(m0[, 1:900]), sum(r0[,1:900]), sum(m0))
Unit: milliseconds
expr min lq mean median uq
m0[, 1:900] 10.087403 12.350751 16.697078 18.307475 19.054157
sum(m0[, 1:900]) 11.067583 13.341860 17.286514 19.123748 19.990661
sum(r0[, 1:900]) 11.066164 13.194244 16.869551 19.204434 20.004034
sum(m0) 1.015247 1.040574 1.059872 1.049513 1.067142
max neval
58.238217 100
25.664729 100
23.505308 100
1.233617 100
对整个矩阵求和的基准任务只需 1.059872 毫秒,约快其他函数 16 倍。
r0[, 1:900]中的错误:维度数量不正确
。 - 5thlibrary('ref')
修复了它。 - dvantwiskRcpp
或compiler
可能会给你带来所需的性能提升。 - Hack-Rsum(colSums(m0)[1:900])
)。 - Hack-R