使用迭代器将矢量复制到数组中

时间:2017-02-02 06:15:53

标签: c++ r iterator rcpp

我一直试图将矢量复制到一个没有运气的数组中。我不熟悉迭代器,这似乎是最好的选择,但我无法让副本正常工作。这是代码:

// [[Rcpp::export]]
  Rcpp::LogicalMatrix mateFamily(const Rcpp::LogicalVector& parent1, 
                                 const Rcpp::LogicalVector& parent2) {
    // init
      int i, AllCount, crossPt, crossCol;
      AllCount = parent1.length();
      Rcpp::LogicalVector child1(AllCount), child2(AllCount);
      Rcpp::LogicalMatrix matePop(6,AllCount);
    // print parents
      std::cout << "parent1=" << parent1 << '\n';
      std::cout << "parent2=" << parent2 << '\n';
    // create 6 children
    for (i = 0; i < 3; ++i) {  
      // determine crossover location
         crossPt = i + 1;
         crossCol = 3*(crossPt==1) + 6*(crossPt==2) + 9*(crossPt==3);
      // swap
         // child1 = parent1/parent2
           std::copy(parent1.begin(), parent1.end(), child1.begin());
           std::copy(parent2.begin()+crossCol, parent2.end(), child1.begin()+crossCol);
         // child2 = parent2/parent1
           std::copy(parent2.begin(), parent2.end(), child2.begin());
           std::copy(parent1.begin()+crossCol, parent1.end(), child2.begin()+crossCol);
         // print children
           std::cout << "child1= " << child1 << '\n';
           std::cout << "child2= " << child2 << '\n';
         // copy children into matePop
           std::copy(child1.begin(), child1.end(), matePop.begin()+i*AllCount);
           std::copy(child2.begin(), child2.end(), matePop.begin()+i*AllCount);
    }
    std::cout << "matePop=" << '\n' << matePop << '\n';
    return matePop;
  }

遗传交叉代码可以工作并创建正确的子组合,但我无法弄清楚如何将所有6个孩子复制到matePop中。

R中为此简化示例定义的测试父级是:

    parent1 <- cbind(1,1,1, 1,1,1, 1,1,1, 1,1,1)
    parent2 <- cbind(0,0,1, 0,0,1, 0,0,1, 0,0,1) 

非常感谢任何帮助。

交叉部分有效。这是输出:

parent1=  1 1 1 1 1 1 1 1 1 1 1 1     
parent2=  0 0 1 0 0 1 0 0 1 0 0 1    
 child1=  1 1 1 0 0 1 0 0 1 0 0 1  
 child2=  0 0 1 1 1 1 1 1 1 1 1 1  
 child1=  1 1 1 1 1 1 0 0 1 0 0 1  
 child2=  0 0 1 0 0 1 1 1 1 1 1 1  
 child1=  1 1 1 1 1 1 1 1 1 0 0 1  
 child2=  0 0 1 0 0 1 0 0 1 1 1 1   

这是matePop输出:

matePop=
100110011100
100110011100
111111111111
001110011001
001110011001
111111111111

所以,神秘的是孩子们被复制到matePop

1 个答案:

答案 0 :(得分:0)

你应该这样做:

std::copy(child1.begin(), child1.end(), matePop.begin()+2*i*AllCount);
std::copy(child2.begin(), child2.end(), matePop.begin()+(2*i+1)*AllCount);

matePop是一个2d矩阵,有6行和AllCount列。因此,您第一次要复制到第0行和第1行。第二次复制到2&amp; 3等等。