【发布时间】:2021-06-25 11:55:18
【问题描述】:
我必须使用物理公式进行一些模拟。在一个公式中,有许多变量。我想用 100 个样本改变这些变量。对于每个样本,我必须使用所有组合进行计算。简化的 for 循环更好地解释了我想要做什么:
set.seed(3)
a = rnorm(100)
b = rnorm(100)
c = rnorm(100)
d = rnorm(100)
f = rnorm(100)
for (a in 1:length(a)) {
for (b in 1:length(b)) {
for (c in 1:length(c)) {
for (d in 1:length(d)) {
for (f in 1:length(f)) {
value = a + b / c * d - f # for illustrative purposes only
# ....
# ... then I append the value to a vector etc.
}
}
}
}
}
如您所见,当要改变的参数数量(每个参数 100 个样本)增加时,模拟次数会呈指数增加,计算时间也会增加。我必须改变 10-15 个参数并计算所有参数组合的“值”。有什么办法(完全)可以避免这些循环吗?在处理这样的大型计算时,有什么好的编程习惯?
【问题讨论】:
-
您的代码将生成一个包含 100 ^ 5 = 10e5 个值的向量。你确定那是你想要的吗?这是一个非常大的数字,并且该向量将占用超过 37 GiB 的 RAM。
-
@KonradRudolph 我正在生成合成数据,对于我的任务,我可以生成的数据越多,它就越能帮助我解决我正在处理的问题。我可以访问异常出色的计算机,因此计算机功率不是什么大问题。但是,我目前的 for-loop 方法并不吸引人,我觉得应该有更好的方法来解决这个问题。
-
在一个问题上投入更多的数据只能让你到目前为止:详尽的搜索的用处非常有限,这就是为什么它们很少这样做,即使使用强大的硬件也是如此。 ——也就是说,你应该看看 R 的矩阵运算;特别是
outer。使用此功能,您可以摆脱所有循环。
标签: r loops for-loop nested-loops