【问题标题】:Is there a systematic way to convert R code with loops to vectorized code?是否有系统的方法将带有循环的 R 代码转换为矢量化代码?
【发布时间】:2010-11-26 13:53:21
【问题描述】:

大部分循环代码是这样的

retVal=NULL
for i {
  for j {
    result <- *some function of vector[i] and vector[j]* 
    retVal = rbind(retVal,result)
  }
}

既然这么普遍,有没有系统的方法来翻译这个成语?

这可以扩展到大多数循环吗?

【问题讨论】:

    标签: r loops


    【解决方案1】:

    plyr 包提供了一组通用工具,用于在处理大数据结构时替换循环结构,方法是将其分解为多个部分,独立处理每个部分,然后将结果重新组合在一起。

    【讨论】:

      【解决方案2】:

      第一个目标应该是获得工作代码。你在那里。然后尝试一些简单的优化。例如。

      retVal <- matrix(NA, ni, nj)     # assuming your result is scalar
      for (i in 1:ni)
         for (j in 1:nj)
             retVal[i][j] <- *some function of yours*
      

      运行速度已经快了很多,因为您不需要为每个 i,j 组合重新分配内存。

      至于循环,您可以先用 apply 系列中的东西替换内部循环。我不知道有什么完全通用的东西可以回答你的问题——这取决于你的函数采用什么参数以及它产生什么类型的返回对象。

      【讨论】:

      • 明白了。我从您的回复中得到的一个可概括的事情是,当您有两个下标在一个向量上运行时,预分配一个矩阵是一个好主意。另一个想法可能是自己交叉原始向量来制作一个矩阵,然后使用矩阵运算得到一个结果矩阵。
      • 是的,可能有更好的直接矩阵(即二维)索引方法。比如说,如何对矩阵的所有元素求幂。但是预分配的影响已经很大了——我的“R 高性能计算简介”教程中有一个计时示例。
      猜你喜欢
      • 2022-01-23
      • 2011-11-19
      • 2017-01-04
      • 2012-01-09
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多