是时候从矩阵对象中获取元素了

时间:2013-06-11 11:53:21

标签: r matrix microbenchmark

与此question类似,我运行了一个微基准测试来从大矩阵中读取单个元素。我很惊讶地看到使用行名时性能下降了多少:

m = matrix(1, nrow=1000000, ncol=10)
rownames(m) = as.character(1:1000000)
microbenchmark(m["3450", 1], m[3450, 1], times=1000)
Unit: microseconds
         expr       min        lq      median          uq        max neval
 m["3450", 1] 176465.55 183443.369 185321.5540 185982.0840 522346.477  1000
 m[3450, 1]        3.19      3.445     10.7155     14.1545     29.897  1000

我绝对需要使用行名来读取我的矩阵元素。我怎样才能提高表现?

更新

我添加了Geoffrey回答和子集()的基准测试结果。我不知道为什么但是subset()有更好的只读性能([[]]允许赋值,子集()没有):

 microbenchmark(m["3450", 1], m[["3450", 1]], m[3450, 1], .subset(m, 1)["3450"], .subset(m, 1)[3450], times=1000)
Unit: microseconds
                  expr        min         lq      median          uq        max neval
          m["3450", 1] 176667.252 180197.435 181969.2900 185090.9155 254075.814  1000
        m[["3450", 1]]    144.732    145.341    151.1440    191.9960   1096.183  1000
            m[3450, 1]      2.900      3.290      4.4400      6.5025     22.391  1000
 .subset(m, 1)["3450"]      2.704      3.140      4.1285     14.8740     43.134  1000
   .subset(m, 1)[3450]      2.460      2.815      3.2680     13.0300     38.105  1000

1 个答案:

答案 0 :(得分:3)

你可以使用m [[“3450,1]]。'[['运算符只选择一个元素(我相信第一个元素)然后返回它。'''用于选择多个元素理想情况下,你首先不会将字符作为rownames ...

microbenchmark(m["3450", 1], m[["3450", 1]],m[3450, 1], times=1000)
Unit: nanoseconds
           expr      min       lq   median       uq       max neval
   m["3450", 1] 74898303 76755304 78038970 87569666 231740997  1000
 m[["3450", 1]]    30790    32657    48673    55671    241340  1000
     m[3450, 1]      623     1245     2800     6532     26125  1000