Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从矩阵对象获取元素的时间_R_Matrix_Microbenchmark - Fatal编程技术网

R 从矩阵对象获取元素的时间

R 从矩阵对象获取元素的时间,r,matrix,microbenchmark,R,Matrix,Microbenchmark,与此类似,我运行了一个微基准,从一个大矩阵中读取单个元素。我惊讶地发现,使用行名称时性能会降低多少: 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

与此类似,我运行了一个微基准,从一个大矩阵中读取单个元素。我惊讶地发现,使用行名称时性能会降低多少:

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 answer和subset()的基准测试结果。我不知道为什么,但是subset()具有更好的只读性能([[]]允许赋值,subset()不允许):

您可以使用m[[“3450,1]]。“[[”运算符只选择一个元素(我相信是第一个元素),然后返回它。“[”用于选择多个元素。理想情况下,您不会将字符作为行名放在第一位

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

仍然慢了近20倍。矩阵不是使用哈希结构从行名称中为元素单元索引设置键吗?@RobertKubrick它会动态构造哈希,并且只有在比线性搜索更有效的情况下,即当您使用多个名称进行子集时,才会进行。为什么这对您来说是一个限制?为什么您需要如此频繁地使用这样的子集,以使尝试?为什么需要通过行名重复访问矩阵元素?也许,您应该重新考虑您的算法?从
?。子集
,除了方法分派不发生之外。
。这就是为什么它更快的原因。
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