【问题标题】:Reducing computation time for matrix operation in for loop in R减少R中for循环中矩阵运算的计算时间
【发布时间】:2019-07-24 14:35:56
【问题描述】:

对于以下两个矩阵,我想找到每一列的平均值。行数少,列数少,容易查找。

  yy=matrix(c(1:40), nrow = 10, ncol = 4)
    tt=c(1:8)
    yy_new=matrix(NA, nrow = 10, ncol=length(tt))
    yy_new1=matrix(NA, nrow = 10, ncol=length(tt))
    dim(yy_new)
    for ( it in 1:10){
      for ( tim in 1:8){
        yy_new[it, tim]=yy[it,1]+yy[it,3]*tt[tim]
        yy_new1[it, tim]=yy[it,2]+yy[it,4]*tt[tim]+2
      }
    }
yy_new_mean=apply(yy_new,2,mean) #column wise mean of the first matrix 

yy_new1_mean=apply(yy_new1,2,mean)

如果列数和行数非常大,比如 10000 行和 2000 列,则创建内部循环 (yy_new and yy_new1) 中的矩阵会花费太多时间。我可以有效地做到这一点,以便计算不会花费很长时间吗?

【问题讨论】:

  • 创建矩阵 yy_new[iteration, tim] 需要很长时间。我可以在不存储矩阵的情况下获得 col 均值吗?
  • 谢谢。我正在尝试加快创建矩阵 yy_new[iteration, tim] 和 yy_new1[iteration, tim] 的计算
  • 你能举例说明yy_new 矩阵应该是什么样子吗?现在代码不起作用,因为您没有定义it。那是迭代吗?
  • 为什么不试试apply() 它通常更快。此外,如果您想使用 for 循环,请使用foreach(),它可以并行工作并且速度更快
  • 现在应该可以了,我已经定义好了。 @Leo Barlach

标签: r matrix


【解决方案1】:

您可以使用函数outer 来创建您想要的结果矩阵:

yy_new <- outer(1:10, 1:8, function(x,y){
  yy[x,1]+yy[x,3]*tt[y]
})

yy_new1 <- outer(1:10, 1:8, function(x,y){
  yy[x,2]+yy[x,4]*tt[y]+2
})

这比for 循环快得多。一般来说,在 R 中,您希望避免 for 循环,因为大多数函数都是矢量化的。

使用microbenchmark比较这两个选项,大约快100倍:

  min       lq       mean   median       uq      max neval
 6207.115 6601.342 7691.66462 6868.801 7215.776 45110.99   100
   27.152   30.855   50.98553   56.066   61.532   195.35   100

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2015-02-20
    • 2011-04-22
    • 1970-01-01
    • 2015-05-03
    • 2015-06-20
    • 2022-01-01
    相关资源
    最近更新 更多