【问题标题】:How to use multicore with loops in R如何在 R 中使用带循环的多核
【发布时间】:2013-06-03 04:59:47
【问题描述】:

我需要加快这个内置循环的速度,请问我该怎么做?

for(M_P in 0:9)
{
for(M_D in 0:(9-M_P))
{
for(M_A in 0:(9-M_P-M_D))
{
  for(M_CC in 0:(9-M_P-M_D-M_A))
  {
    for(M_CD in (9-M_P-M_D-M_A-M_CC))
    {


      for(G_D in 0:9)
      {
        for(G_A in 0:(9-G_D))
        {
          for(G_CC in 0:(9-G_D-G_A))
          {
            for(G_CD in (9-G_D-G_A-G_CC))
            {


              for(S_D in 0:9)
              {
                for(S_A in 0:(9-S_D))
                {
                  for(S_CC in 0:(9-S_D-S_A))
                  {
                    for(S_CD in (9-S_D-S_A-S_CC))
                    {


                      for(Q_P in 0:3)
                      {
                        for(Q_D in 0:(3-Q_P))
                        {
                          for(Q_A in 0:(3-Q_P-Q_D))
                          {
                            for(Q_CC in 0:(3-Q_P-Q_D-Q_A))
                            {
                              for(Q_CD in (3-Q_P-Q_D-Q_A-Q_CC))
                              {

计算需要很长时间,请问我该怎么做?我只是一个初学者,但我听说应用程序或多核可能有一些问题,我有 4 个核心,我正在使用 Rstudio,请帮助我。谢谢各位!

PS:告诉我您是否需要其余代码,但这是使用所有 M_P、M_D 等使用 * 和 + 进行的简单计算。如果我将其放置一夜,它是否有机会结束?我想在其中添加几个循环,所以我必须再做 3 到 10 次:s

【问题讨论】:

  • 您是否考虑过使用expand.grid 将您的所有组合放入一个data.frame 中?
  • 抱歉我的算法不完整,我发的太快了!我添加了核心元素,即循环中的“-”
  • 当我开始使用 R 时,我学到的一个教训是向量化问题而不是循环。代码以这种方式运行得更快。其中一些在以下问答中进行了描述:stackoverflow.com/questions/13475039/…。您可能希望将此作为解决问题的新思路。
  • 近 20 个嵌套的 for 循环?并行化对您没有多大帮助。在 C 中可能会这样做,但由于您想使用 R,您应该对代码进行矢量化。我强烈推荐阅读this document
  • 我建议你扩展你的问题,包括一个工作示例,以及你想要完成的描述。很难说向量化是否会很简单,但是拥有 20 个嵌套循环总是一个坏主意。有关如何编写好示例的详细信息,请参阅stackoverflow.com/questions/5963269/…

标签: r loops for-loop multicore


【解决方案1】:

变量M_xxG_xxS_xxQ_xx 是独立的。此外,还会生成许多重合值。我已将这 4 个变量拆分为单独的循环,然后生成所有组合,仅考虑唯一值。见代码:

M <- NULL

for(M_P in 0:9) for(M_D in 0:(9-M_P)) for(M_A in 0:(9-M_P-M_D)) for(M_CC in 0:(9-M_P-M_D-M_A)) for(M_CD in (9-M_P-M_D-M_A-M_CC))
{
    M[length(M)+1] <- 1.1*M_P+2.1*M_D+3.1*M_A+4.1*M_CC+4*M_CD
}

G <- NULL

for(G_D in 0:9) for(G_A in 0:(9-G_D)) for(G_CC in 0:(9-G_D-G_A)) for(G_CD in (9-G_D-G_A-G_CC))
{
    G[length(G)+1] <- 2*G_D+5*G_A+1.5*G_CC+3*G_CD
}

S <- NULL

for(S_D in 0:9) for(S_A in 0:(9-S_D)) for(S_CC in 0:(9-S_D-S_A)) for(S_CD in (9-S_D-S_A-S_CC))
{
    S[length(S)+1] <- 5*S_D+4*S_A+3*S_CC+6*S_CD
}

Q <- NULL

for(Q_P in 0:3) for(Q_D in 0:(3-Q_P)) for(Q_A in 0:(3-Q_P-Q_D)) for(Q_CC in 0:(3-Q_P-Q_D-Q_A)) for(Q_CD in (3-Q_P-Q_D-Q_A-Q_CC))
{
    Q[length(Q)+1] <- 2*Q_P+3*Q_D+2.2*Q_A+3*Q_CC+4*Q_CD
}

max(apply(expand.grid(unique(M), unique(G), unique(S), unique(Q)), 1, sum))

【讨论】:

  • 其实我的变量在真实场景中并不是独立的,我在编程方面太糟糕了,无法从你的开始找到一个太糟糕的解决方案,但我验证了你的答案,因为你的回答方式是这样的我问了谢谢!
猜你喜欢
  • 2022-01-05
  • 2016-08-01
  • 2014-11-01
  • 1970-01-01
  • 2017-05-03
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多