首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速嵌套循环;它能被矢量化吗?

加速嵌套循环;它能被矢量化吗?
EN

Stack Overflow用户
提问于 2011-10-04 03:29:30
回答 1查看 724关注 0票数 3

我正在尝试在一个相当大的数据集上匹配一些数据,即使是在中等大小的数据集上也需要花费太长的时间。

我正在执行的任务是处理一个机械问题,然后返回6个月,寻找程序问题(个别员工的失败)。我首先在机器和位置上进行匹配,所以我希望将相同的位置与相同的机器进行匹配。然后我要求程序错误出现在机械错误之前,因为它是在未来。最后,为了保持可比性,我将其限制在180天内。

在数据构建阶段,我将机械问题限制在前6个月之外,因此我对每个问题都有相同的180天块。

我读过很多关于优化循环的文章。我知道您想在循环外部创建一个存储变量,然后添加到其中,但我实际上并不知道它将返回多少匹配,所以最初我在循环中使用rbind。我知道存储变量的上限是机械问题的数量*程序问题的数量,但这是巨大的,我不能分配那么大的向量。我在这里放置的代码采用了最大存储变量方法,但我认为我必须回到下面这样的方法:

代码语言:javascript
复制
if (counter == 1) {
    pro = procedural[i, ]
    other = mechanical[j, ]
}
if (counter != 1) {
    pro = rbind(pro, procedural[i, ])
    other = rbind(other, mechanical[j, ])
}

我也读过不少关于矢量化的文章,但我从来没有真正让它工作过。我在矢量化方面尝试了一些不同的方法,但我认为我一定是做错了什么。

我还尝试删除第二个循环,并仅使用the命令,但在将整列数据(来自过程数据)与单个值(来自机械数据)进行比较的情况下,这似乎不起作用。

这是我目前拥有的代码。它适用于小数据集,但对于任何远程大的数据集,它永远需要花费很长时间。

代码语言:javascript
复制
maxval = mechrow * prorow
pro = matrix(nrow = maxval, ncol = ncol(procedural))
other = matrix(nrow = maxval, ncol = ncol(procedural))
numprocissues = matrix(nrow = mechrow, ncol = 1)
counter = 1
for (j in 1:mechrow) {
    for (i in 1:prorow) {
        if (procedural[i, 16] == mechanical[j, 16] &
            procedural[i, 17] < mechanical[j, 17] &
            procedural[i, 2] == mechanical[j, 2] &
            abs(procedural[i, 17] - mechanical[j, 17]) < 180) {

            pro[counter, ] = procedural[i, ]
            other[counter, ] = mechanical[j, ]
            counter = counter + 1
        }
    }
    numprocissues[j, 1] = counter
}

我认为可以改进的地方是我的存储变量,潜在的矢量化,改变if语句中的条件,或者可能是一个删除循环的花哨语句。

任何建议都将不胜感激!

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-04 03:51:54

未经测试..。

代码语言:javascript
复制
xy <- expand.grid(mech=1:mechrow, pro=1:prorow)
ok <- (procedural[xy$pro, 16] == mechanical[xy$mech, 16] &
       procedural[xy$pro, 17] <  mechanical[xy$mech, 17] &
       procedural[xy$pro,  2] == mechanical[xy$mech,  2] &
       abs(procedural[xy$pro, 17] -  mechanical[xy$mech, 17]) < 180)
pro   <- procedural[xy$pro[ok],]
other <- mechanical[xy$mech[ok],]
numprocissues <- tapply(ok, xy$mech, sum)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7639712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档