【发布时间】:2022-10-17 09:11:11
【问题描述】:
我一直在尝试使用更高效的数据结构和并行处理以及其他一些东西。我在将脚本从大约 60 秒内运行到大约 9 秒内运行方面取得了很好的进展。
不过,我一生都无法理解的一件事是在 Rcpp 中编写一个循环。具体来说,一个循环根据前一行结果逐行计算并随时更新数据。
想知道是否有人可以将我的代码转换为 Rcpp,这样我就可以通过一个我非常熟悉的示例进行反向工程并弄清楚它是如何完成的。
这是一个循环,计算每行 3 个变量的结果。第 1 行必须单独计算,然后第 2 行以后根据当前行和先前行的值进行计算。
这个示例代码只有 6 行长,但我的原始代码有数千行:
temp <- matrix(c(0, 0, 0, 2.211, 2.345, 0, 0.8978, 1.0452, 1.1524, 0.4154,
0.7102, 0.8576, 0, 0, 0, 1.7956, 1.6348, 0,
rep(NA, 18)), ncol=6, nrow=6)
const1 <- 0.938
for (p in 1:nrow(temp)) {
if (p==1) {
temp[p, 4] <- max(min(temp[p, 2],
temp[p, 1]),
0)
temp[p, 5] <- max(temp[p, 3] + (0 - const1),
0)
temp[p, 6] <- temp[p, 1] - temp[p, 4] - temp[p, 5]
}
if (p>1) {
temp[p, 4] <- max(min(temp[p, 2],
temp[p, 1] + temp[p-1, 6]),
0)
temp[p, 5] <- max(temp[p, 3] + (temp[p-1, 6] - const1),
0)
temp[p, 6] <- temp[p-1, 6] + temp[p, 1] - temp[p, 4] - temp[p, 5]
}
}
在此先感谢,希望这需要具有 Rcpp 技能的人只需一两分钟!
编辑:感谢您的帮助。只是想知道如果 x 是 6 个向量的列表,而不是 6 列的矩阵,如何布置它......我在想这样的事情,但不确定如何让它工作:
List getResult( ??? x, double const1) {
for (int p=1; p<x.nrow(); p++){
x[3](p) = std::max(std::min(x[p](p), x[0](p) + x[5](p - 1)), 0.0);
x[4](p) = std::max(x[2](p) + (a[5](p - 1) - const1), 0.0);
x[5](p) = x[5](p - 1) + x[0](p) - x[3](p) - x[4](p);
}
return x
}
【问题讨论】:
-
如果您想更快地运行它,是否将第一个 if 移到循环外并运行 for (p in 2 :...) 是否有意义?我假设你的矩阵比这里显示的要大。每个循环为您节省两次检查。
-
谢谢,是的,好点,这是一个廉价而讨厌的示例代码,但我已经完成了: for (p in 1:1) {} and for (p in 2:rowslength) {} in my main code