我一直试图将矢量复制到一个没有运气的数组中。我不熟悉迭代器,这似乎是最好的选择,但我无法让副本正常工作。这是代码:
// [[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
答案 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等等。