避免 R 中的两个 for 循环

2024-02-07

我有一个 R 代码可以对两个函数进行卷积...

convolveSlow <- function(x, y) {  
nx <- length(x); ny <- length(y)  
xy <- numeric(nx + ny - 1)  
for(i in seq(length = nx)) {  
 xi <- x[[i]]  
        for(j in seq(length = ny)) {  
            ij <- i+j-1  
            xy[[ij]] <- xy[[ij]] + xi * y[[j]]  
        }  
    }  
    xy  
}  

有没有办法去掉两个for循环,让代码运行得更快?

谢谢 桑


由于 R 计算向量运算的速度非常快,因此在进行性能编程时要记住的最重要的事情是对尽可能多的运算进行向量化。

这意味着要认真考虑用向量运算替换循环。这是我的快速卷积解决方案(每个长度为 1000 的输入向量快 50 倍):

convolveFast <- function(x, y) {
    nx <- length(x)
    ny <- length(y)
    xy <- nx + ny - 1
    xy <- rep(0, xy)
    for(i in (1:nx)){
        j <- 1:ny
        ij <- i + j - 1
        xy[i+(1:ny)-1] <- xy[ij] + x[i] * y
    }
    xy
}

您会注意到内部循环(for j in ...)已经消失。相反,我用向量运算替换了它。 j 现在定义为向量 (j

j <- 1:ny
ij <- i + j - 1
xy[i+(1:ny)-1] <- xy[ij] + x[i] * y

我写了一个小函数来衡量性能:

measure.time <- function(fun1, fun2, ...){
    ptm <- proc.time()
    x1 <- fun1(...)
    time1 <- proc.time() - ptm

    ptm <- proc.time()
    x2 <- fun2(...)
    time2 <- proc.time() - ptm

    ident <- all(x1==x2)

    cat("Function 1\n")
    cat(time1)
    cat("\n\nFunction 2\n")
    cat(time2)
    if(ident) cat("\n\nFunctions return identical results")

}

对于两个长度各为 1000 的向量,我获得了 98% 的性能提升:

x <- runif(1000)
y <- runif(1000)
measure.time(convolveSlow, convolveFast, x, y)

Function 1
7.07 0 7.59 NA NA

Function 2
0.14 0 0.16 NA NA

Functions return identical results
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免 R 中的两个 for 循环 的相关文章

  • 修复 ggplot 中构面中的数据顺序

    我在使用 ggplot 绘制数据时遇到问题 我无法使每个方面内的数据正确排序 我的样本数据是 data lt structure list Parameter c 0 1 0 7 0 0 0 2 0 2 0 7 0 0 0 1 0 3 0
  • 在单个显示器中绘制多个 jpeg 图像

    我需要在单个组合显示器 或画布 中绘制和显示多个 jpeg 图像 例如 假设我有图像 a b c d jpg 每个图像的大小不同 我想将它们绘制在 2x2 网格的一页上 能够为每个子图设置标题也很好 我一直在彻底寻找解决方案 但不知道如何去
  • R 中的转换会导致文档错误

    每当我运行此代码时 tm map 行都会给我警告消息 警告信息 在 tm map SimpleCorpus docs toSpace 中 转换删除文档 texts lt read csv Data fast food Domino s Do
  • 当测试集中不存在响应变量时,h2o 预测有时会失败

    当在不存在响应变量的测试集上进行预测时 如果在训练中对因子变量使用一种热编码 则 h2o 会以各种不同的方式失败 无论是在训练 GLM 时隐式指定还是在其他方法中显式指定时 R 3 4 0 和 h2o 3 12 0 1 中存在此错误 我们还
  • 在ggplotly散点图中添加自定义数据标签

    我想显示Species对于每个数据点 当光标位于该点上方而不是 x 和 y 值时 我用iris数据集 另外 我希望能够单击数据点以使标签持久存在 并且当我在图中选择新位置时标签不会消失 如果可能的话 最基本的是标签 持久性问题是一个优点 这
  • 栅格堆叠后如何写入?

    我想操作几个光栅文件 然后再次写入它们 rasterfiles lt list files C data envi full names TRUE d1 lt overlay stack rasterfiles fun function x
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 有没有一种简单的方法可以根据多个标准进行排名,从而保留 R 中的联系?

    当单个标准排序良好时 rank 函数会返回明显的结果 rank c 2 4 1 3 5 1 2 4 1 3 5 当单个标准具有联系时 排名函数 默认情况下 将平均排名分配给联系 rank c 2 4 1 1 5 1 3 0 4 0 1 5
  • 将 read.csv 与符号链接文件一起使用

    我正在尝试做什么 我的源文件非常大 我想避免将其复制到其他文件夹中 我决定创建一个指向大文件的符号链接并想使用read csv读取文件 文件夹结构 项目1 数据 源文件 csv 项目2 数据 别名到源文件 csv 什么地方出了错 读取源文件
  • 以编程方式触发 R 传单中的标记鼠标单击事件以获得闪亮效果

    我的问题与此相同 在 R 传单中触发标记鼠标单击事件以获得闪亮效果 https stackoverflow com questions 56962857 trigger marker mouse click event in r leafl
  • 在 mutate 和 across 之后使用 ~separate

    目的是将所有物种 setosa 行转换为一行 setosa 这是一个最小的示例 实际上有更多列和更多组 我有这个数据框 head iris 2 gt select 1 2 5 gt group by Species Sepal Length
  • R:编写抛硬币的随机采样程序

    假设我们有以下情况 有一枚硬币 如果它正面朝上 那么下一次抛掷正面的概率是 0 6 如果是反面 那么下一次抛掷反面的概率也是 0 6 一个班有100名学生 每个学生随机抛掷硬币几次 Student n 的最后一次抛硬币不会影响 Studen
  • R:为什么 boxplot(x,log="y") 与 boxplot(log(x)) 不同?

    delme lt exp rnorm 1000 1 5 0 3 boxplot delme log y boxplot log10 delme 为什么这两个图中的胡须不同 谢谢 阿古斯 我想说的是 在您的第一个图中 您只是将 y 轴更改为对
  • 将 RDS 文件从网络(即 URL)直接加载到 R 中?

    read csv 具有直接从 url 读取的出色能力 readRDS 才不是 我想将 RDS 文件从 Internet 移动到我的 R 环境 我看到有几种方法 Method 1 此方法会用下载的文件弄乱工作目录 myurl lt https
  • jupyter 中的 r 图形 - 无法启动 png() 设备

    我在 Jupyter 中使用 R 但无法在笔记本本身中绘制图表 这是一个可重现的示例 set seed 123 mat as matrix x rnorm 100 y rnorm 100 plot mat 在朱皮特中 Error in pn
  • rpart是自动剪枝吗?

    Is rpart自动修剪 生成的决策树rpart比具有自动修剪功能的 Oracle Data Mining 生成的级别要多得多 否 但拟合函数的默认值可能会 提前 停止分割 对于 早期 的某些定义 See rpart control对于您可
  • 如何使用 sprintf 函数在字符中添加前导“0”而不是空格?

    我正在尝试使用sprintf函数为字符添加前导 0 并使所有字符长度相同 然而我得到的是领先空间 My code a lt c 12 123 1234 sprintf 04s a 1 12 123 1234 我试图得到什么 1 0012 0
  • 聚合日期时间以总结在特定条件下花费的时间

    我很困惑我应该如何继续 我下面有一些虚拟数据 Date lt as POSIXct c 2018 03 20 11 52 25 2018 03 22 12 01 44 2018 03 20 12 05 25 2018 03 20 12 10
  • matplotlib 中的 R 风格数据轴缓冲区

    R 绘图自动设置 x 和 y 限制 以在数据和轴之间留出一些空间 我想知道 matplotlib 是否有办法自动执行相同的操作 如果没有 是否有一个好的公式或 经验法则 来说明 R 如何设置其轴限制 在 matplotlib 中 您可以通过
  • 将不同的 grViz 组合成一个图

    我想结合不同的DiagrammeR绘制成一个图形 生成的图如下例所示 library DiagrammeR pDia lt grViz digraph boxes and circles a graph statement graph ov

随机推荐