gpt4 book ai didi

performance - 加速嵌套循环;可以向量化吗?

转载 作者:行者123 更新时间:2023-12-04 03:02:30 26 4
gpt4 key购买 nike

我正在尝试匹配一些可能是相当大的数据集的数据,即使是中等规模的数据集也需要很长时间。

我正在执行的任务是解决机械问题,然后回溯 6 个月并寻找程序问题(个别员工的失败)。我先匹配机器和位置,所以我想用同一台机器匹配同一个地方。然后我要求程序错误出现在机械错误之前,因为它在未来。最后,我将其限制为 180 天以保持可比性。

在数据构建阶段,我将机械问题限制为排除前 6 个月,因此每个月都有相同的 180 天时间段。

我读过一些关于优化循环的文章。我知道您想在循环外创建一个存储变量,然后将其添加到其中,但实际上我不知道它会返回多少匹配项,所以最初我一直在循环内使用 rbind。我知道存储变量的上限是机械问题的数量 * 程序问题的数量,但这是巨大的,我无法分配那么大的向量。我放在这里的代码有我的最大存储变量方法,但我想我将不得不回到这样的事情:

if (counter == 1) {
pro = procedural[i, ]
other = mechanical[j, ]
}
if (counter != 1) {
pro = rbind(pro, procedural[i, ])
other = rbind(other, mechanical[j, ])
}

我也阅读了一些关于矢量化的内容,但我从未真正设法让它发挥作用。我在矢量化方面尝试了一些不同的东西,但我认为我一定做错了什么。

我还尝试删除第二个循环并仅使用 which 命令,但这似乎不适用于将整列数据(来自程序数据)与单个值(来自机械数据)进行比较。

这是我目前的代码。它适用于小型数据集,但对于任何非常大的数据集,它就需要很长时间。

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 语句中的条件或者可能是想出要删除循环的语句。

如有任何建议,我们将不胜感激!

谢谢。

最佳答案

未经测试...

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)

关于performance - 加速嵌套循环;可以向量化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7639712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com