Возникли проблемы при заполнении массива строк - PullRequest
0 голосов
/ 10 июля 2019

Моя программа - выравнивание последовательности ДНК.Он сравнивает две последовательности ДНК путем поиска серии символов, которые находятся в одинаковом порядке во всех последовательностях.

Я преодолел блокпост и был бы очень признателен за помощь.Мне нужно заполнить свою матрицу выравнивания, чтобы она выглядела примерно так:

OUTPUT

Это всего лишь пример, две строки ДНК могут быть любымиразмер, который я извлекаю из отдельного файла, но у меня есть все это.Мне просто нужна помощь, чтобы поместить это в матрицу.

Сначала я думал о создании массива двумерных символов, но затем переключился на массив двумерных строк, поскольку мои последовательности ДНК хранятся в двух строках.

РУКОВОДЯЩИЕ ПРИНЦИПЫ ПО ЗАПОЛНЕНИЮ MTX:

 Все слоты в верхнем ряду должны быть установлены на штрафы за пробелы, умноженные на их индекс, т.е. 0 * пробел, 1 * пробел, 2 * пробел…

 Все слоты в левом столбце должны быть установлены на штрафы за пробелы, умноженные на их индекс, т.е. 0 * пробел, 1 * пробел, 2 * пробел…

 Начиная с верхнего левого угла, самый пустойслот и работа слева направо, сверху вниз, каждый слот должен быть заполнен в соответствии со следующими ограничениями:  Если буква для каждой строки ДНК, соответствующей положению слота, одинакова, то значение слота должно быть по диагонали вверх и влевозначение слота плюс оценка совпадения

 Если буква для каждой последовательности, соответствующей положению слота, не совпадает, то значение слота должно быть не более: o Значение восходящего слота плюс штраф за пробел oЗначение левого слота плюс штраф за пробел o Значение диагонали вверх и левого слота плюс штраф за несоответствие

Вот код, который у меня есть:

int match = 1;
int mismmatch = 7;
int gap = -1;

string seq1 = "GAATTCAGTA"; //DNA sequence 1: GAATTCAGTA
string seq2 = "GGATCGA"; //DNA sequence 2: GGATCGA

int DNA1Size = seq1.length();
int DNA2Size = seq2.length();

string mtx[DNA2Size][DNA1Size];

matrix[0][0] = " ";
matrix[0][1] = "-";
matrix[1][0] = "-";

for(int i = 2; i < DNA2Size; i++)
{
    mtx[i] = seq2.at(i);     //Hoping this would initialize the first row with sequence 2 
}

for(int z = 2; z < DNA1Size; z++)
{
    mtx[z] = seq1.at(z);    ////Hoping this would initialize the first column with sequence 1
}

Итак,Я знаю, что это неправильно, но это то, что я получил до сих пор.Это я пытаюсь инициализировать первую строку и столбец обозначенными буквами и пробелами / тире.Кроме того, остальная часть матрицы должна быть инициализирована с использованием разрыва, соответствия и несоответствия, но, поскольку я даже не получил эту часть, я еще не начал с этого.Если бы кто-нибудь мог помочь, я бы любил тебя вечно!

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Вы должны принять во внимание, что вам нужно на 2 строки и столбца больше, чем размер ваших последовательностей, если вы хотите хранить символы '' и '-' в начале.

Чтобы заполнить первую строку в матрице, оставьте индекс строки равным 0 и измените индекс цикла столбца (ячейки). Чтобы заполнить столбец, нужно сделать наоборот - сохранить индекс столбца 0 и изменить индекс строки. Пример решения:

string seq1 = "GAATTCAGTA"; //DNA sequence 1: GAATTCAGTA 
string seq2 = "GGATCGA"; //DNA sequence 2: GGATCGA

int DNA1Size = seq1.length();
int DNA2Size = seq2.length();
int i, rows, columns;
rows = DNA2Size + 2;
columns = DNA1Size + 2;

char matrix[rows][columns]; //some compiler allow to define matrix this way

matrix[0][0] = ' ';
matrix[0][1] = '-';
matrix[1][0] = '-';

for (i=0; i<DNA2Size; i++)
  matrix[i+2][0] = seq2.at(i);  //filling first column

  for (i=0; i<DNA1Size; i++)
    matrix[0][i+2] = seq1.at(i); //filling first row
0 голосов
/ 10 июля 2019

Этот подход должен помочь вам:

#include <iostream>
#include <string>
#include <vector>

using std::string;
using std::vector;
using Matrix = vector<vector<string>>;

int main()
{
    string seq1 = "GAATTCAGTA"; //DNA sequence 1: GAATTCAGTA
    string seq2 = "GGATCGA"; //DNA sequence 2: GGATCGA

    int DNA1Size = seq1.length();
    int DNA2Size = seq2.length();
    const int numHdrCells = 2;

    Matrix matrix(DNA2Size + numHdrCells, vector<string>(DNA1Size + numHdrCells));
    matrix[0][0] = " ";
    matrix[0][1] = "-";
    matrix[1][0] = "-";

    for (int i = 0; i < DNA1Size; i++) {
        matrix[0][i + numHdrCells] = seq1.at(i);     //Hoping this would initialize the first row with sequence 1
    }

    for (int z = 0; z < DNA2Size; z++) {
        matrix[z + numHdrCells][0] = seq2.at(z);    ////Hoping this would initialize the first column with sequence 2
    }
    std::cout << "Hello World!\n";
}


...