【发布时间】:2018-02-11 10:40:05
【问题描述】:
我面临以下问题:我需要一个大矩阵的许多子集。实际上我只需要视图作为另一个函数 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 倍。
【问题讨论】:
-
尝试您的示例时出现错误:
Error in r0[, 1:900] : incorrect number of dimensions -
library('ref')修复它 -
好的,那么解决方案的标准是什么?它是否必须比您现在正在做的更快,还是必须比对整个矩阵求和更快?
-
使用
Rcpp或compiler可能会给您带来所需的性能提升 -
@Hack-R 编译器通常没那么有用。
标签: r performance matrix ref