2017-02-02 11 views
0

Я пытаюсь скопировать вектор в массив без везения. Я не знаком с итераторами, которые кажутся лучшим выбором, но мне не удалось заставить копию работать правильно. Вот код:Копирование вектора в массив с использованием итераторов

// [[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

Значит, вы не можете определить '// копировать детей в matePop' часть, и все, что над этим работает нормально? – SingerOfTheFall

+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 - это 2-я матрица с 6 строками и AllCount столбцов. Так что в первый раз вы будете копировать в строки 0 и 1. Второй раз в 2 & 3 и так далее.

+0

Спасибо. Не могу поверить, что я пропустил эту ошибку индекса. Я сделал исправление, но результат по-прежнему не загружается в matePop должным образом. Вывод показан выше. –

+0

Я диагностировал проблему с матрицей вывода matePop. Итератор загружает дочерние значения в «вертикальном», а не «горизонтальном порядке». Странное поведение. Я могу кодировать в обходной путь, но мне интересно, что вызывает проблему. –

+0

@Sean S R использует (и, следовательно, Rcpp, 'Rcpp :: Matrix' и т. Д.) Порядок столбцов, а не порядок строк, так что вызов, например. 'std :: copy (src1.begin(), src1.end(), dst.begin())', 'std :: copy (src2.begin(), src2.end(), dst.begin() + std :: distance (src1.begin(), src1.end())) ', ..., заполнит объект назначения по столбцу, а не строка за строкой. – nrussell